1.非阻塞演算法
非阻塞演算法屬於並發演算法,它們可以安全地派生它們的線程,不是透過鎖定派生,而是透過低階的原子性的硬體原生形式―― 例如比較和交換。非阻塞演算法的設計與實現極為困難,但是它們能夠提供更好的吞吐率,對生存問題(例如死鎖和優先反轉)也能提供更好的防禦。使用底層的原子化機器指令取代鎖,例如比較並交換(CAS,compare-and-swap).
2.悲觀技術
獨佔鎖是一種悲觀的技術.它假設最壞的情況發生(如果不加鎖,其它線程會破壞對象狀態),即使沒有發生最壞的情況,仍然用鎖保護對象狀態.
3.樂觀技術
依賴衝突監控.先更新,如果監控發生衝突發生,則放棄更新後重試,否則更新成功.現在處理器都有原子化的讀-改-寫指令,比如比較並交換(CAS,compare-and- swap).
4.CAS操作
CAS有3個運算元,記憶體值V,舊的預期值A,要修改的新值B。當且僅當預期值A和記憶體值V相同時,將記憶體值V修改為B,否則什麼都不做。 CAS典型使用模式是:先從V中讀取A,並根據A計算新值B,然後再透過CAS以原子方式將V中的值由A變成B(只要在這段期間沒有任何線程將V的值修改為其他值)。
清單3. 說明比較並交換的行為(而非效能)的程式碼複製程式碼如下:
public class SimulatedCAS {
private int value;
public synchronized int getValue() { return value; }
public synchronized int compareAndSwap(int expectedValue, int newValue) {
int oldValue = value;
if (value == expectedValue)
value = newValue;
return oldValue;
}
}
清單4. 使用比較並交換實作計數器複製程式碼代碼如下:
public class CasCounter {
private SimulatedCAS value;
public int getValue() {
return value.getValue();
}
public int increment() {
int oldValue = value.getValue();
while (value.compareAndSwap(oldValue, oldValue + 1) != oldValue)
oldValue = value.getValue();
return oldValue + 1;
}
}
5.原子變數
原子變數支援不用鎖保護就能原子性更新操作,其底層以CAS實現。共有12個原子變量,可分為4組:標量類、更新器類、數組類、複合變量類。最常用的原子變數就是標量類別:AtomicInteger、AtomicLong、AtomicBoolean以及AtomicReference。所有類型都支援CAS。
6.性能比較:鎖與原子變量
在中低程度的競爭下,原子變數能提供很高的可伸縮性,原子變數表現超過鎖;而在高強度的競爭下,鎖能夠更有效地避免競爭,鎖的性能將超過原子變數的性能。但在更真實的實際情況中,原子變數的表現將超過鎖的性能。