JMM的可見性和原子性

2021-10-05 22:39:31 字數 682 閱讀 4481

乙個方法中相鄰的2行**不一定按從上到下的順序執行:jmm允許編譯器和處理器對指令重排序。

as-if-serial語義:不管怎麼重排序(編譯器和處理器為了提高並行度),(單執行緒)程式的執行結果不能被改變。

編譯器、runtime和處理器都必須遵守as-if-serial語義。編譯器和處理器不會對存在資料依賴關係的操作做重排序。

synchronized/cas保證原子性。

atomic原子類為什麼可以保證原子性:基於unsafe的cas方法,unsafe迴圈cas。

cas概念

1.cas的全稱為compare-and-swap ,它是一條cpu併發原語。

2.作業系統原語是由若干條指令組成,用於完成某個功能的乙個過程。原語的執行必須是連續的,在執行過程中不允許中斷。

3.cas是一條系統原語,也即是說cas是一條原子指令,不會造成所謂的資料不一致的問題。

cas作用

1.判斷記憶體某個位置的值是否為預期值,如果是則更新為新的值,這個過程是原子的。

cas缺點

1.迴圈時間長的話開銷很大(高併發場景下只有1個執行緒cas成功,其他執行緒都cas失敗進入死迴圈,會消耗cpu)。

2.只能保證1個共享變數的原子性。

3.aba問題:狸貓換太子。如何解決:atomicstampedreference

synchronize的可見性和原子性

synchronize 可以保證變數可見性和一段 的原子性 jmm關於synchronized的兩條可見性規定 執行緒解鎖前,必須把共享變數的最新值重新整理到主記憶體中 執行緒加鎖時,將清空工作記憶體中共享變數的值,從而使用共享變數時需要從主記憶體中重新讀取最新的值 參考 reentrantlock...

原子性,可見性,有序性

1.原子性 read,load,assign,use,store write 基本型別的訪問,讀寫 long,double 非原子性協定 monitorenter,monitorexit jvm lock,unlock,synchronized 2.可見性 volatile synchronized...

執行緒的原子性與可見性

同步最基本的目的是保證原子性。另乙個容易忽略的目的是可見性,即乙個執行緒修改的共享資料對另乙個執行緒可見。因為一些基本型別的賦值操作本身是原子的。所以針對這些賦值操作在不使用synchronized的情況下,可以使用volatile來解決乙個執行緒的修改對另乙個執行緒的可見。所以volatile是在...