Synchronized的使用和注意事項

 

synchronized:java

一、取得的鎖都是對象鎖,而不是把一段代碼或方法(函數)看成鎖;安全

二、多個線程訪問的必須是同一個對象。多線程

三、當一個線程執行的代碼出現異常時,其所持有的鎖會自動釋放併發

四、A線程持有Object對象的Lock鎖,B線程能夠以異步方式調用Object對象中的非synchronized類型的方法異步

五、A線程持有Object對象的Lock鎖,B線程若是在這時調用Object對象中的synchronized類型的方法則須要等待,也就是同步函數

六、當一個線程獲得一個對象鎖後,再次請求此對象鎖時時能夠再次獲得該對象的鎖的;this

 

代碼塊:spa

一、A線程訪問對象的synchronize代碼塊時,B線程依然能夠訪問對象的非synchronize代碼塊;線程

二、A線程訪問對象的synchronize代碼塊時,B線程依然能夠訪問對象的synchronize代碼塊將會被阻塞;對象

三、線程A訪問對象調用synchronize代碼塊時,線程B訪問對象的synchronize方法時,將獲取線程A的對象鎖;

四、"任意對象"做爲對象監視器來實現同步的功能。這個"任意對象"大多數是實例變量及方法的參數,全局實例變量,synchronized(非this),

        不用阻塞每個代碼塊,有效提升效率。

 

靜態同步方法是類鎖,非靜態同步方法時對象鎖,獨立執行。

一、局部變量每調用一次方法其值都在當前線程的當前棧中臨時分配;

二、也就是說對程序,同一時刻,只可能有一塊棧內存被當前方法使用,用完了就回收了;

三、因此多線程併發訪問一個只用到局部變量的方法是不用考慮併發安全性的。

 

 

  • synchronized (object)與synchronized (this)同樣,獲取實例對象的鎖.
  • 由於synchronized (this)只能獲取當前實例鎖,那麼synchronized (object)就是能夠獲取其餘實例鎖的意思
  • 對於synchronized 最簡單粗暴的理解就是,你要哪些線程方法同步,就跟他們獲取同樣的鎖好了,A.class,就獲取A.class, 
  •  objectA 就獲取 objectA(我說的不是對象名相同,而是真真切切在java堆中的同一個對象),

 



synchronized與static synchronized 的區別

synchronized是對類的當前實例(當前對象)進行加鎖,防止其餘線程同時訪問該類該實例的全部synchronized塊

static synchronized剛好就是要控制類的全部實例的併發訪問

相關文章
相關標籤/搜索