锁的可见性保证
?Java鎖保證可見性的具體實現
Happens-before規則
從JDK 5開始,JSR-133定義了新的內存模型,內存模型描述了多線程代碼中的哪些行為是合法的,以及線程間如何通過內存進行交互。
新的內存模型語義在內存操作(讀取字段,寫入字段,加鎖,解鎖)和其他線程操作上創建了一些偏序規則,這些規則又叫作Happens-before規則。它的含義是當一個動作happens before另一個動作,這意味著第一個動作被保證在第二個動作之前被執行并且結果對其可見。我們利用Happens-before規則來解釋Java鎖到底如何保證了可見性。
Java內存模型一共定義了八條Happens-before規則,和Java鎖相關的有以下兩條:
- 內置鎖的釋放鎖操作發生在該鎖隨后的加鎖操作之前
- 一個volatile變量的寫操作發生在這個volatile變量隨后的讀操作之前
Lock的加解鎖和synchronized有同樣的內存語義,也就是說,下一個線程加鎖后可以看到所有前一個線程解鎖前發生的操作
?
總結
- 上一篇: 代码演示:获取锁时被中断
- 下一篇: 互斥同步锁