Synchronized的使用和註意事項
synchronized:
1、取得的鎖都是對象鎖,而不是把一段代碼或方法(函數)當作鎖;
2、多個線程訪問的必須是同一個對象。
3、當一個線程執行的代碼出現異常時,其所持有的鎖會自動釋放
4、A線程持有Object對象的Lock鎖,B線程可以以異步方式調用Object對象中的非synchronized類型的方法
5、A線程持有Object對象的Lock鎖,B線程如果在這時調用Object對象中的synchronized類型的方法則需要等待,也就是同步
6、當一個線程得到一個對象鎖後,再次請求此對象鎖時時可以再次得到該對象的鎖的;
代碼塊:
1、A線程訪問對象的synchronize代碼塊時,B線程依然可以訪問對象的非synchronize代碼塊;
2、A線程訪問對象的synchronize代碼塊時,B線程依然可以訪問對象的synchronize代碼塊將會被阻塞;
3、線程A訪問對象調用synchronize代碼塊時,線程B訪問對象的synchronize方法時,將獲取線程A的對象鎖;
4、"任意對象"作為對象監視器來實現同步的功能。這個"任意對象"大多數是實例變量及方法的參數,全局實例變量,synchronized(非this),
不用阻塞每一個代碼塊,有效提高效率。
靜態同步方法是類鎖,非靜態同步方法時對象鎖,獨立執行。
1、局部變量每調用一次方法其值都在當前線程的當前棧中臨時分配;
2、也就是說對程序,同一時刻,只可能有一塊棧內存被當前方法使用,用完了就回收了;
3、所以多線程並發訪問一個只用到局部變量的方法是不用考慮並發安全性的。
- synchronized (object)與synchronized (this)一樣,獲取實例對象的鎖.
- 因為synchronized (this)只能獲取當前實例鎖,那麽synchronized (object)就是可以獲取其他實例鎖的意思
- 對於synchronized 最簡單粗暴的理解就是,你要哪些線程方法同步,就跟他們獲取一樣的鎖好了,A.class,就獲取A.class,
- objectA 就獲取 objectA(我說的不是對象名相同,而是真真切切在java堆中的同一個對象),
synchronized與static synchronized 的區別
synchronized是對類的當前實例(當前對象)進行加鎖,防止其他線程同時訪問該類的該實例的所有synchronized塊
static synchronized恰好就是要控制類的所有實例的並發訪問
Synchronized的使用和註意事項