一.對象及變量的併發訪問

章主要介紹Java多線程中的同步,也就是如何在java語言中寫出線程安全的程序。java

synchronized同步方法

  非線程安全其實會在多個線程對同一個對象中的實例變量進行併發訪問時發生,產生的後果就是「髒讀」。安全

方法內的變量爲線程安全

  「非線程安全」問題存在於「實例變量」中,若是是方法內部的私有變量,則不存在「非線程安全問題」,所得的結果也就是線程安全了。多線程

 

 

 

 方法中的變量不存在非線程安全問題,永遠都是線程安全的。這是方法內部變量是私有的性質決定的。併發

實例變量非線程安全

若是多個線程共同訪問一個對象中的實例變量,則有可能出現「非線程安全」問題。異步

多個對象多個鎖

 

 

 

 

上面的例子是兩個線程分別訪問同一個類的兩個不一樣實例的相同名稱的同步方法。效果倒是以異步的方式運行的。測試

本示例因爲建立了2個業務對象,在系統中產生了2個鎖,因此運行的結果是異步的,打印的效果就是先打印b,而後打印a。this

也是說同步方法的鎖就是該對象實例。線程

 

synchronized方法和鎖對象

調用關鍵字synchronized聲明的方法必定是排隊運行的。另外須要牢記「共享」兩個字。只有共享資源的讀寫訪問才須要同步化,若是3d

不是共享資源,那麼根本沒有同步的必要。對象

 

髒讀

synchronized鎖重入

 

出現異常,鎖自動釋放

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

同步不具備繼承性

synchronized同步代碼塊

synchronized同步代碼塊

當一個線程訪問object的一個synchronized同步代碼塊時,另外一個線程仍然能夠訪問該object對象中的非同步代碼塊。

驗證同步synchronized(this)代碼塊時鎖定當前對象的

和synchronized方法同樣,synchronized(this)代碼塊也是鎖定當前的對象的。

 

 

 

 將任意對象做爲對象監視器

這個任意對象大多數是實例對象或方法參數。

使用「synchronized(非this對象)」同步代碼塊格式進行同步操做時,對象監視器必須是同一個對象。若是不是同一個對象監視器,運行的結果就是異步了。

 

細化三個結論

靜態同步synchronized方法與synchronized(class)代碼塊

  關鍵字synchronized還能夠應用在static靜態方法上,若是這樣寫,那就是對當前的。*.jave文件對應的Class類進行持鎖,測試項目在synStaticMethod中.

相關文章
相關標籤/搜索