Java并發(fā)編程之原子變量與非阻塞同步機制
1.非阻塞算法
非阻塞算法屬于并發(fā)算法,它們可以安全地派生它們的線程,不通過鎖定派生,而是通過低級的原子性的硬件原生形式 —— 例如比較和交換。非阻塞算法的設(shè)計與實現(xiàn)極為困難,但是它們能夠提供更好的吞吐率,對生存問題(例如死鎖和優(yōu)先級反轉(zhuǎn))也能提供更好的防御。使用底層的原子化機器指令取代鎖,比如比較并交換(CAS,compare-and-swap).
2.悲觀技術(shù)
獨占鎖是一種悲觀的技術(shù).它假設(shè)最壞的情況發(fā)生(如果不加鎖,其它線程會破壞對象狀態(tài)),即使沒有發(fā)生最壞的情況,仍然用鎖保護對象狀態(tài).
3.樂觀技術(shù)
依賴沖突監(jiān)測.先更新,如果監(jiān)測發(fā)生沖突發(fā)生,則放棄更新后重試,否則更新成功.現(xiàn)在處理器都有原子化的讀-改-寫指令,比如比較并交換(CAS,compare-and-swap).
4.CAS操作
CAS有3個操作數(shù),內(nèi)存值V,舊的預(yù)期值A(chǔ),要修改的新值B。當(dāng)且僅當(dāng)預(yù)期值A(chǔ)和內(nèi)存值V相同時,將內(nèi)存值V修改為B,否則什么都不做。CAS典型使用模式是:首先從V中讀取A,并根據(jù)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. 使用比較并交換實現(xiàn)計數(shù)器
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實現(xiàn)。共有12個原子變量,可分為4組:標(biāo)量類、更新器類、數(shù)組類以及復(fù)合變量類。最常用的原子變量就是標(biāo)量類:AtomicInteger、AtomicLong、AtomicBoolean以及AtomicReference。所有類型都支持CAS。
6.性能比較:鎖與原子變量
在中低程度的競爭下,原子變量能提供很高的可伸縮性,原子變量性能超過鎖;而在高強度的競爭下,鎖能夠更有效地避免競爭,鎖的性能將超過原子變量的性能。但在更真實的實際情況中,原子變量的性能將超過鎖的性能。
相關(guān)文章
SpringBoot中創(chuàng)建的AOP不生效的原因及解決
這篇文章主要介紹了SpringBoot中創(chuàng)建的AOP不生效的原因及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Java基于正則表達式實現(xiàn)xml文件的解析功能詳解
這篇文章主要介紹了Java基于正則表達式實現(xiàn)xml文件的解析功能,結(jié)合實例形式分析了java使用正則表達式針對xml文件節(jié)點的相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
關(guān)于@RequestBody和@RequestParam注解的使用詳解
這篇文章主要介紹了關(guān)于@RequestBody和@RequestParam注解的使用詳解,本文十分具有參考意義,希望可以幫助到你,如果有錯誤的地方還望不吝賜教2023-03-03
Windows系統(tǒng)中Java調(diào)用cmd命令及執(zhí)行exe程序的方法
這篇文章主要介紹了Windows系統(tǒng)中Java調(diào)用cmd命令及執(zhí)行exe程序的方法,主要用到了IOException類,需要的朋友可以參考下2016-03-03
從Mybatis-Plus開始認(rèn)識SerializedLambda的詳細過程
這篇文章主要介紹了從Mybatis-Plus開始認(rèn)識SerializedLambda,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2024-07-07

