volatile的适用场景
volatile保證線程間的數據是可見的(共享的),但不保證數據同步
volatile相當于synchronized的弱實現,也就是說volatile實現了類似synchronized的語義,卻又沒有鎖機制。它確保對volatile字段的更新以可預見的方式告知其他的線程。
volatile包含以下語義:
(1)Java 存儲模型不會對valatile指令的操作進行重排序:這個保證對volatile變量的操作時按照指令的出現順序執行的。
(2)volatile變量不會被緩存在寄存器中(只有擁有線程可見)或者其他對CPU不可見的地方,每次總是從主存中讀取volatile變量的結果。也就是說對于volatile變量的修改,其它線程總是可見的,并且不是使用自己線程棧內部的變量。也就是在happens-before法則中,對一個valatile變量的寫操作后,其后的任何讀操作理解可見此寫操作的結果。
volatile變量的特性不錯,但是volatile并不能保證線程安全的,也就是說volatile字段的操作不是原子性的,volatile變量只能保證可見性(一個線程修改后其它線程能夠理解看到此變化后的結果),要想保證原子性,目前為止只能加鎖!
volatile通常在下面的場景:
volatilebooleandone=false;
…
while(!done ){
dosomething();
}
應用volatile變量的三個原則:
(1)寫入變量不依賴此變量的值,或者只有一個線程修改此變量
(2)變量的狀態不需要與其它變量共同參與不變約束
(3)訪問變量不需要加鎖
總結
以上是生活随笔為你收集整理的volatile的适用场景的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机虚拟机是什么意思(9008是什么)
- 下一篇: 病例对照研究数据分析