JMM、CAS與volatile

weixin_46313750發表於2020-11-29

JMM

JMM

CAS(比較並交換)

過程

  • V:要更新的變數(var)
  • E:預期值(expected) //V變數該有的值
  • N:新值(new)

比較並交換的過程如下:

判斷V是否等於E,如果等於,將V的值設定為N;如果不等,說明已經有其它執行緒更新了V,則當前執行緒放棄更新,什麼都不做

存在的問題

  • ABA:加上時間戳或版本號
  • 迴圈時間長開銷大,自旋
  • 能保證一個共享變數的原子操作

volatile關鍵字

happens-before規則

  • 給程式設計師使用的規則
  • 只要寫程式碼的時候遵循happens-before規則
  • JVM就能保證指令在多執行緒之間的順序性符合程式設計師的預期

volatile作用

保證記憶體的可見性

  • 寫:執行緒本地記憶體中所有共享變數的值寫入到記憶體中
  • 讀:執行緒本地記憶體中所有共享變數的值置為無效,從記憶體中重新讀取

禁止與普通變數重排序

volatile記憶體語義的實現

參考文章
image.png

相關文章