synchronized实现可见性对比volatile
最近花時間研究了下,如有不正確的地方,歡迎大家批評指正,謝謝。
首先先介紹一下JMM(JAVA內存模型),上圖:
java內存模型的工作原理如上圖所示,一些被定義的變量都存放在主內存中,當一個線程想要修改一個變量的值時,那么這個變量會從主內存中拷貝到線程的工作內存(CPU緩存)中。之后線程對變量值做了更改,又會重新拷貝回主內存中。大家通過描述也可以看出來這些操作是分步執行的,這樣就無法保證可見性和原子性。對于這種情況java也給出了很多解決辦法,今天跟大家分享一下我對synchronized以及volatile的理解。
?
大家知道synchronized是通過加互斥鎖來實現原子性的,JMM關于synchronized的兩條規定:
我來簡單描敘一下線程執行互斥代碼的過程:
synchronized從而實現類原子性,也具備內存可見性。
這里多說一下Lock,其實原理跟synchronized類似,但是比synchronized更加靈活,我們會在下一篇博客中詳細探討synchronized的缺陷以及Lock的基本用法。
volatile是如何實現內存可見性的呢?
深入來說:是通過加入內存屏障和禁止重排序優化來實現的。(重排序指單線程中在保證執行結果不變的前提下java虛擬機為了提升處理速度可能會將指令重排,達到最合理化)
- 對volatile變量執行寫操作時,會在寫操作后加入一條store屏障指令
?
- 對volatile變量執行讀操作時,會在讀操作前加入一條load屏障指令
簡單來說:volatile變量在每次被線程訪問時,都強迫從sy主內存中重讀變量的值,而當該變量發生變化時,又會強迫線程將最新的值刷新到主內存。這樣在任何時刻,不同的線程總能看到該變量的最新值。從而保證了變量的內存可見性。
?
synchronized和volatile的比較
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的synchronized实现可见性对比volatile的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MongoDB存储文件之GridFS
- 下一篇: qqhd怎么进入群课堂(V5.9.6)