1- 方法全部未同步
隨機呼叫,且是非同步呼叫
2、乙個被同步乙個未同步
呼叫同步方法的執行緒先加鎖。但呼叫未同步方法的執行緒可以非同步載入。
3、方法全部被同步
隨機順序執行第乙個同步的執行緒。該執行緒獲得當前方法的lock。若此時其它執行緒呼叫其它同步方法,需等待以加鎖方法全部執行完釋放lock。
髒讀一定會出現在操作例項變數的情況下,這就是不同執行緒爭搶例項變數的結果。
物件a存在x、y、z三個同步方法,執行緒呼叫同步方法x,若在同步方法中呼叫同步方法y,則y可獲得物件鎖,同理在y中呼叫方法z,z也可獲得物件鎖。
且如果在方法x中同時呼叫方法y和方法z,會按順序執行y和z。
防止死鎖。
在執行同步方法x時,該執行緒獲得物件的同步鎖。在未釋放鎖之前,其它無法獲得該物件的同步鎖,因此無法執行。而擁有該鎖的執行緒,可以繼續執行其方法。
在之前的介紹中,多個執行緒呼叫乙個同步方法時,是按順序執行的。那麼如果第乙個執行緒執行方法耗時過長,那麼第二個呼叫該方法的執行緒將等待過長的時間,這是不合理的。
但是單純的使用**塊,效率是不會提公升的,因為本質還是同步實現的。
實現方式:一半同步一半非同步。
只用synchronized修飾需要同步的部分**。
可見性:乙個執行緒對共享變數值的修改,能夠及時的被其它執行緒看到。
原子性:即同步。該關鍵字修飾的方法要麼不執行要麼執行完,不存在執行一半的情況。
1- volatile是執行緒同步的輕量級實現,只能修飾變數。synchronized可修飾變數、方法和**塊。
2- volatile不會發生阻塞,synchronized會發生阻塞。
3- synchronized同時具有可見性和原子性,volatile只具有可見性
4- synchronized關鍵字解決的是多個執行緒之間訪問資源的同步性,volatile關鍵字解決的是變數在多個執行緒之間的可見性。
synchronized實現可見性:
1- 獲得互斥鎖。
2- 清空工作記憶體。
3- 從主存拷貝資料到工作副本。
4- **操作。
5- 將修改後的資料寫入主存。
6- 釋放互斥鎖。
併發程式設計學習 2 物件的共享
思維導圖 本文主要介紹類的域變數被多個執行緒共享時所導致的可見性問題。我所理解的可見性是指類的域變數在某一線程中變化時能夠及時準確的被其他執行緒所看見。文章還是分成兩個部分進行描述 理論部分 包括如何判斷域變數是否可見,會導致什麼樣的問題,又該如何解決。使用部分 通過 不發布物件 發布但不可修改 安...
Java多執行緒摘要 物件及變數的併發訪問
1 非執行緒安全 問題在於 例項變數 中,如果是方法內部的私有變數,則不存在 非執行緒安全 問題.2 關鍵字synchronized取得的都是物件鎖,而不是把一段 或方法 函式 當做鎖,所以哪個執行緒先執行synchronized關鍵字的方法,哪個執行緒就持有該方法所屬物件的鎖lock,那麼其他執行...
java執行緒學習 2 物件的共享
編寫安全的執行緒就是對共享資料的操作不出現問題,通過同步使來避免多個執行緒同一時刻方位共享資料,或者共享和發布物件,從而使能夠安全地由多個執行緒同時訪問。可見性 public class novisibility public static void main string args 這段 不推薦這...