來源https://blog.csdn.net/jesonjoke/article/details/79848032 多線程
可見性:一個線程對主內存的修改能夠及時被其餘線程觀察到。併發
致使共享變量在線程間不可見的緣由:優化
1.線程交叉執行;spa
2.從新排序結合線程交叉執行;.net
3.共享變量更新後的值沒有在工做內存中與主內存間及時更新。線程
VM處理可見性
JVM對於可見性,提供了synchronized和volatileblog
JMM關於synchronized的兩條規定:排序
線程解鎖前,必須把共享變量的最新值刷新到主內存
線程加鎖時,將清空工做內存中共享變量的值,從而使用共享變量時須要從主內存中從新讀取最新的值(注意:加鎖與解鎖是同一把鎖)
Volatile:經過加入內存屏障和禁止重排序優化來實現內存
有序性:Java內存模型中,容許編譯器和處理器對指令進行重排序,可是從新排序過程不會影響到單線程程序的執行,卻會影響到多線程併發執行的正確性。編譯器
保證有序性:Java提供了volatile ,synchronized ,Lock能夠保證有序性。