1. 程式人生 > >java中鎖與同步需要注意的幾點

java中鎖與同步需要注意的幾點

1.只能給方法或方法的一部分加鎖,不能給類和變數加鎖

2.不必同步類中所有的方法,類可以同時擁有同步和非同步方法

3.每一個物件只有一個鎖,需要清楚同步是加在了什麼上面--物件

4.對於一個物件中的同步方法被一個執行緒呼叫之後,其他的執行緒將無法再次呼叫這個物件的同步方法,必須要等到第一個執行緒呼叫同步方法完成之後,第二個執行緒才能呼叫這個物件的同步方法,同時其他的執行緒將進入阻塞狀態,不能再呼叫這個物件的同步方法(注意,這裡的執行緒都是通過同一個物件去呼叫同步方法)

5.如果一個物件中有同步方法和非同步方法,那麼非同步方法可以同時被多個執行緒呼叫,不必像同步方法一樣,必須等到呼叫同步方法完成之後,才能呼叫

6.執行緒睡眠時,執行緒持有的鎖不會被釋放。

7.同一個執行緒可以獲得多個鎖,這是因為,一個執行緒可以通過其方法呼叫多個物件的多個同步方法

8.同步對於併發不利,所以要謹慎使用同步或者儘量使用範圍小的同步方法,因為同步可以同步方法,也可以同步方法中的一小部分程式碼,所以如果要用同步方法,則儘量的使用範圍小的同步。

9.在程式中使用同步程式碼的時候,要明確呼叫的是哪個物件的鎖,也就是在synchronized(object)中的object必須明確

摘自熔岩多執行緒http://lavasoft.blog.51cto.com/62575/99155

相關推薦

java同步需要注意

1.只能給方法或方法的一部分加鎖,不能給類和變數加鎖 2.不必同步類中所有的方法,類可以同時擁有同步和非同步方法 3.每一個物件只有一個鎖,需要清楚同步是加在了什麼上面--物件 4.對於一個物件中的同步方法被一個執行緒呼叫之後,其他的執行緒將無法再次呼叫這個物件的同步方法,

關於Java思考

當對共享資源進行訪問的時候必須使用鎖對資源進行獨佔式宣告,保證同一時間只有一個執行緒對共享資源進行訪問。而一個執行緒可以多次訪問加鎖的共享資源,因為一個執行緒對共享資源的訪問都是順序的,不可能發生併發訪問共享資源導致的問題。所以,所有的鎖對於一個執行緒來說都是可重入的,只要當前執行緒獲取

Java的實現記憶體語義

1. 概述 鎖在實際使用時只是明白鎖限制了併發訪問, 但是鎖是如何實現併發訪問的, 同學們可能不太清楚, 下面這篇文章就來揭開鎖的神祕面紗. 2. 鎖的記憶體語義 當執行緒獲取鎖時, JMM會把執行緒對應的本地記憶體置為無效. 從而使得被監視器保護的臨界區的變數必須從主記憶體中讀取

java執行緒同步種方法

方法一: 使用synchronized關鍵字  由於java的每個物件都有一個內建鎖,當用此關鍵字修飾方法時, 內建鎖會保護整個方法。在呼叫該方法前,需要獲得內建鎖,否則就處於阻塞狀態。 注: synchronized關鍵字也可以修飾靜態方法,此時如果呼叫該靜態方法,將會

Java多執行緒程式設計-(12)-Java的佇列同步器AQS和ReentrantLock原理簡要分析

原文出自 : https://blog.csdn.net/xlgen157387/article/details/78341626 一、Lock介面 在上一篇文章中: Java多執行緒程式設計-(5)-使用Lock物件實現同步以及執行緒間通訊 介紹

java執行緒同步Synchronized,監視器monitor和lock的關係是什

既然有關監視器monitor的概念比較難,大家怎麼解釋的都有。首先我給出一下java的官方文件,也是最權威的解釋: Synchronizationis built around an internal entity known as the intrinsic lock ormonitor lock. (Th

轉:JavaStringbyte[]的轉換

輸出字符串 單個字符 linu 編輯 繁體 中國人 對象 本質 計算機基礎知識 String s = "fs123fdsa";//String變量 byte b[] = s.getBytes();//String轉換為byte[] String t = new Stri

Java創建數組的種方法

java false 三種 數組下標 [1] [] 判斷 color str Java中創建數組的幾種方法 public static void main(String[] args) { //創建數組的第一種方法 int[] arr=new int[6]; int

關於Java的總結

信號 原子操作 turn 內存堆 int() ext return 總結 多個 多個進程或線程同時(或著說在同一段時間內)訪問同一資源會產生並發(線程安全)問題。解決並發問題可以用鎖。 java的內置鎖: 每個java對象都可以用做一個實現同步的鎖,這些鎖稱為內置鎖。線程進

201671010145 2016-2017-3《Java程序設計》Java對象的區別

import -c indent cin ria wid let isp ans 1.什麽是類呢? 書面語句:類是一種事物,或者一類相同物體的抽象.類是對一個或者幾個相似對象的描述,它把不同對象具有的共性抽象出來.也可以說類是同一類對象的原型. 例如:人就是一個類,因為它是

java日期字符串之間的轉換

oda ava ret .text tostring simple cep 日期格式 clas import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;

JavaDateString的相互轉換

獲取 org 復制 日期類型 junit clas 時間 -m see 我們在註冊網站的時候,往往需要填寫個人信息,如姓名,年齡,出生日期等,在頁面上的出生日期的值傳遞到後臺的時候是一個字符串,而我們存入數據庫的時候確需要一個日期類型,反過來,在頁面上顯示的時候,需要從數據

java stringbytes的轉換總結

set post java lan bsp nbsp 發現 blog fff 最近在和導航設備的通訊服務,和設備通訊時,需要將字符串以UTF-16編碼傳遞。 那如何將string,轉換為byte[]?其實Java提供了現成的實現:java.lang.string.getby

Java的級別

很大的 必須 靜態 解鎖 類鎖 幫助 不同 級別 str Java中的鎖按等級分可以分為對象鎖、方發鎖、類鎖。java的對象鎖和類鎖:java的對象鎖和類鎖在鎖的概念上基本上和內置鎖是一致的,但是,兩個鎖實際是有很大的區別的,對象鎖是用於對象實例方法,或者一個對象實例上的,

讓你徹底明白JAVA棧的區別

java程序 運行 一點 動態 自動變 key 空間 類型 lin 原文地址:http://www.2cto.com/kf/201302/190704.html 簡單的說: Java把內存劃分成兩種:一種是棧內存,一種是堆內存。 在函數中定義的一些基本類型的變量和對象的引用

Javafinal static final 修飾的常量的區別

評論 tin 產生 建立 dom code 隨機數 ren 使用 喵喵開車,新手上路,多多關照。有任何錯誤請在評論區指出。 ...........................................我是萬惡的分界線( ? ?ω?? )?.............

Javasessionapplication的異同

導致 自動 客戶 器) 每一個 class ica span 關閉 客戶端的session 其實是標記了你的請求來自哪個瀏覽器 問題1:永遠都一樣嗎? 答:重啟了瀏覽器,你的session id就改變了, 結果會導致,再無法取回原來在服務端保存的數據。 問題2:

javaa++++a區別

demo div main highlight print class 結果 public 別了 java中a++與++a區別 a++與++a的區別,如果單獨使用沒有任何區別,如果在運算中就有區別了,a++是先運算在賦值,而++a是先賦值在運算!! class dem

JAVA所有集合有關的實現類都是這六個接口的實現類

length 數字 pack 有關 結構 [] rgs val 無序 JAVA中所有與集合有關的實現類都是這六個接口的實現類。 Collection接口:集合中每一個元素為一個對象,這個接口將這些對象組織在一起,形成一維結構。 List接口代表按照元素一定的相關順序

Javabyte16進制字符串的互相轉換

ring ati case nbsp i++ 轉換成 con htm uil https://www.cnblogs.com/qinwangchen/p/5418028.html * Convert byte[] to hex string.這裏我們可以將byte轉換