程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java並發編程之原子變量與非壅塞同步機制

Java並發編程之原子變量與非壅塞同步機制

編輯:關於JAVA

Java並發編程之原子變量與非壅塞同步機制。本站提示廣大學習愛好者:(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.機能比擬:鎖與原子變量

在中低水平的競爭下,原子變量能供給很高的可伸縮性,原子變量機能跨越鎖;而在高強度的競爭下,鎖可以或許更有用地防止競爭,鎖的機能將跨越原子變量的機能。但在更真實的現實情形中,原子變量的機能將跨越鎖的機能。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved