當前位置:編程學習大全網 - 源碼下載 - java怎麽實現同步非阻塞

java怎麽實現同步非阻塞

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.性能比較:鎖與原子變量

在中低程度的競爭下,原子變量能提供很高的可伸縮性,原子變量性能超過鎖;而在高強度的競爭下,鎖能夠更有效地避免競爭,鎖的性能將超過原子變量的性能。但在更真實的實際情況中,原子變量的性能將超過鎖的性能。

  • 上一篇:3.7發布了,在AndroidStudio中怎麽使用
  • 下一篇:dip付費標準測算與結算的標準是什麽
  • copyright 2024編程學習大全網