1. 程式人生 > >easy-base-concurrent | 執行緒安全-可見性

easy-base-concurrent | 執行緒安全-可見性

導致共享變數線上程間不可見的原因

  • 執行緒交叉執行
  • 重排序結合線程交叉執行
  • 共享變數更新後的值沒有在工作記憶體與主記憶體及時同步

synchronized

JMM關於synchronized的兩條規定:

  • 執行緒解鎖前,必須把共享變數的值更新到主記憶體中
  • 執行緒加鎖前,必須把工作記憶體中的共享變數清空,保證使用共享變數時需要從主記憶體中重新讀取最新的值

volatile

通過加入記憶體屏障禁止重排序優化來實現

  • 對volatile變數寫操作時,會在寫操作後加入一條store屏障指令,將本地記憶體中的變數重新整理到主記憶體
  • 對volatile變數讀操作時,會在讀操作前加入一天龍load屏障指令,從主記憶體中讀取共享變數