1、什麼是原子類
原子類可以認為其操作都是不可分割
2、為什麼要有原子類
對多執行緒訪問同乙個變數,我們需要加鎖,而鎖是比較消耗效能的,jdk1.5之後,新增的原子操作類提供了一種用法簡單、效能高效、執行緒安全地更新乙個變數的方式,這些類同樣位於juc包下的atomic包下,
發展到jdk1.8,該包下共有17個類,囊括了原子更新基本型別、原子更新陣列、原子更新屬性、原子更新引用,其中,jdk1.8新增的原子類有doubleaccumulator、doubleadder、longaccumulator、longadder、striped64
1)大致可以歸為3類
atomicboolean、atomicinteger、atomiclong 元老級的原子更新,方法幾乎一模一樣
doubleadder、longadder 對double、long的原子更新效能進行優化提公升
doubleaccumulator、longaccumulator 支援自定義運算
2)示例
/**
* longaccumulator demo
*/public class demo2
}
1)型別:atomicintegerarray、atomiclongarray、atomicreferencearray
2)示例:
/**
* atomicintegerarray demo
*/public class atomicintegerarraydemo ;
atomicintegerarray atomicintegerarray = new atomicintegerarray(arr);
system.out.println(atomicintegerarray.addandget(1, 8));
int i = atomicintegerarray.accumulateandget(0, 2, (left, right) ->
left * right / 3
);system.out.println(i);}}
1)型別:atomicintegerfieldupdater、atomiclongfieldupdater、atomicstampedreference、atomicreferencefieldupdater
3)示例:修改student類中xuhan的字段
/**
* atomiclongfieldupdaterdemo
*/public class atomiclongfieldupdaterdemo
}class student
public long getid()
public void setid(long id)
public string getname()
public void setname(string name)
}
4、 原子更新引用1)型別:atomicreference:用於對引用的原子更新
atomicmarkablereference:帶版本戳的原子引用型別,版本戳為boolean型別。
atomicstampedreference:帶版本戳的原子引用型別,版本戳為int型別。
2)示例:student類與上面的一致
/**
* atomicreferencedemo
*/public class atomicreferencedemo
}
C 併發程式設計(八) 原子型別與資料競爭
c c 中所有的操作預設為非原子操作。非原子操作,並不保證操作的完整性。當乙個操作由2個以上的指令完成時,操作可能只執行了乙個指令,變數就被另外乙個執行緒搶占。當多個執行緒同時讀寫同乙個變數時,就會發生資料競爭。uint64 t i 0 void foo 上述簡單的賦值語句,通過乙個32位的系統編譯...
Java 併發程式設計 基礎 一
同步 和 非同步描述方法的呼叫。同步 方法呼叫一旦開始,呼叫者必須等到方法呼叫返回後,才能繼續後續的行為。序列的進行方法的呼叫。非同步方法呼叫更像乙個訊息傳遞,一旦方法呼叫就會立即返回。併發 多個任務交替執行。並行 多個cpu的系統上,多個cpu同時執行任務。用來表示公共資源或者公共資料。可以被多個...
Java併發程式設計基礎 ThreadLocal的使用
1.threadlocal 簡介 什麼是threadlocal threadlocal 為執行緒變數,是乙個以threadlocal物件為key,任意物件為值的儲存 結構,這個結構被附帶到執行緒上。threadlocal的作用 通過set t 來設定乙個值,在當前執行緒下通過get 方法獲取到原先設...