国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java并發(fā)編程之原子變量與非阻塞同步機制

2019-11-26 15:13:09
字體:
來源:轉載
供稿:網(wǎng)友

1.非阻塞算法

非阻塞算法屬于并發(fā)算法,它們可以安全地派生它們的線程,不通過鎖定派生,而是通過低級的原子性的硬件原生形式 ―― 例如比較和交換。非阻塞算法的設計與實現(xiàn)極為困難,但是它們能夠提供更好的吞吐率,對生存問題(例如死鎖和優(yōu)先級反轉)也能提供更好的防御。使用底層的原子化機器指令取代鎖,比如比較并交換(CAS,compare-and-swap).

2.悲觀技術

獨占鎖是一種悲觀的技術.它假設最壞的情況發(fā)生(如果不加鎖,其它線程會破壞對象狀態(tài)),即使沒有發(fā)生最壞的情況,仍然用鎖保護對象狀態(tài).

3.樂觀技術

依賴沖突監(jiān)測.先更新,如果監(jiān)測發(fā)生沖突發(fā)生,則放棄更新后重試,否則更新成功.現(xiàn)在處理器都有原子化的讀-改-寫指令,比如比較并交換(CAS,compare-and-swap).

4.CAS操作

CAS有3個操作數(shù),內(nèi)存值V,舊的預期值A,要修改的新值B。當且僅當預期值A和內(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組:標量類、更新器類、數(shù)組類以及復合變量類。最常用的原子變量就是標量類:AtomicInteger、AtomicLong、AtomicBoolean以及AtomicReference。所有類型都支持CAS。

6.性能比較:鎖與原子變量

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 五大连池市| 全州县| 宜都市| 弥勒县| 桐梓县| 五台县| 阿合奇县| 花莲市| 阿坝| 奉节县| 浦东新区| 安岳县| 富裕县| 北碚区| 合阳县| 阿拉善盟| 齐河县| 嵊州市| 湘乡市| 富民县| 钟祥市| 澎湖县| 洞头县| 贵州省| 新巴尔虎左旗| 中宁县| 喀喇沁旗| 谢通门县| 西平县| 东安县| 京山县| 平原县| 密山市| 金华市| 内丘县| 大关县| 舞钢市| 乌拉特中旗| 苍山县| 都匀市| 乌兰县|