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與static synchronized 的區別
synchronized是對類的當前實例(當前對象)進行加鎖,防止其餘線程同時訪問該類的該實例的全部synchronized塊
static synchronized剛好就是要控制類的全部實例的併發訪問