- 原子操作:不可被中斷的一個或者一系列操作。
- 緩存行(cache line):緩存的最小操作單位。
- 比較並交換(compare and swap, CAS):CAS需要輸入兩個數值,一個舊值(期望操作前的值)和一個新值,在操作期間先比較舊值有無發生變化,如果沒有變化才交換成新值,反之,則不交換。
- 處理器實現原子操作
- 處理自動保證基本內存操作的原子性。只保證單個字節的處理操作,復雜的內存操作處理器不能自動保證原子性。
- 使用總線鎖保證原子性。處理器提供一個LOCK信號,當一個處理器在總線上輸出此信號時,其它處理器的請求將被阻塞住。缺點:鎖定期間,其它處理器不能操作其它內存地址,開銷大。
- 使用緩存鎖保證原子性。頻繁使用的內存會緩存在處理器的L1,L2和L3高速緩存里,原子操作可以直接在處理器內部緩存中進行,不需要聲明總線鎖。當一個數據同時被兩個以上處理器緩存以后,緩存的一致性會阻止同時修改處理器中緩存的數據。有兩種情況不能使用緩存鎖定:
- 當操作的數據不能被緩存在處理器內部,或操作的數據跨多個緩存行。
- 有些處理器不支持緩存鎖定。
- JAVA實現原子操作
- 使用循環CAS實現原子鎖–自旋CAS實現的基本思路就是循環進行CAS操作直到成功為止。
- CAS的問題: ABA問題-通過增加版本號/標志解決。循環時間長開銷大。只能保證一個共享變量的原子操作–通過AtomicReference類來保證引用對象之間的原子性,把多個變量放在一個對象中進行CAS操作。
- 使用鎖機制實現原子操作。鎖機制保證了只有獲得鎖的線程才能夠操作鎖定的內存區域。實現有偏向鎖、輕量級鎖和互斥鎖。其中后兩種實現的方式都用到了循環CAS–當一個線程進入同步塊時使用循環CAS的方式來獲取鎖,退出時使用循環CAS釋放鎖。
參考:
