線程安全的可見性和有序性

來源https://blog.csdn.net/jesonjoke/article/details/79848032 多線程

可見性:一個線程對主內存的修改能夠及時被其餘線程觀察到。併發

致使共享變量在線程間不可見的緣由:優化

1.線程交叉執行;spa

2.從新排序結合線程交叉執行;.net

3.共享變量更新後的值沒有在工做內存中與主內存間及時更新。線程

VM處理可見性
JVM對於可見性,提供了synchronized和volatileblog

JMM關於synchronized的兩條規定:排序

線程解鎖前,必須把共享變量的最新值刷新到主內存
線程加鎖時,將清空工做內存中共享變量的值,從而使用共享變量時須要從主內存中從新讀取最新的值(注意:加鎖與解鎖是同一把鎖)
Volatile:經過加入內存屏障和禁止重排序優化來實現內存

  • 對volatile變量寫操做時,會在寫操做後加入一條store屏障指令,將本地內存中的共享變量值刷新到主內存。
  • 對volatile變量讀操做時,會在讀操做前加入一條load屏障指令,從主內存中讀取共享變量。

 

有序性:Java內存模型中,容許編譯器和處理器對指令進行重排序,可是從新排序過程不會影響到單線程程序的執行,卻會影響到多線程併發執行的正確性。編譯器

保證有序性:Java提供了volatile ,synchronized ,Lock能夠保證有序性。

相關文章
相關標籤/搜索