关于java的volatile
記得早前本人寫過一篇關于C關鍵字volatile一點認知文章
由于最近因業務需要一直在做與java相關的開發。故研究了一下java里的volatile這里與C里的大致相同(注:以下如未特殊說明所有volatile都指java里為主)。
java的內存交互用java的指令分為:lock、unlock、read、load、use、assign、store、write這8種。
其中lock、unlock是同步鎖所產生的(如:synchronized、com.util.concurrent中的原子類)。
默認java會開啟優化模式,也就是說后6種操作(read、load、use、assign、store、write)都可能是無序的。
好了,java內存加載大致就是這樣。
volatile的作用就是【read、load、use】與【assign、store、write】這每組里面的操作都是有序的。也就是說不要讓java優化。
網上也說了很多volatile為啥不是線程安全的,其實說白了上面的二元組中間可以插入其它操作,如:
public class VolatileTest {public static volatile int race = 0;public static void raceIncr() {race++;} }這里如果調用receIncr方法會大致執行以下操作:
read、load、use、iconst_1、iadd、assign、store、write
那么這里iconst_1、iadd對其它線程來說并不是可見的。。。
故總結,常用還是賦值吧。。
posted on 2017-09-19 17:05 tywei 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/tywei/p/7552783.html
總結
以上是生活随笔為你收集整理的关于java的volatile的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring boot / cloud
- 下一篇: BZOJ 1977 [BeiJing2