目錄
什么是原子類,作用?
6類原子類縱覽:
AtomicInteger 常用方法
AtomicInArray 使用實體:
Atomic*Reference 參考型別原子類:
什么是原子類,作用?
- java.util.concurrent.atomic 包下的類
-
不可分割的,且一個操作是不可中斷的,即便是多執行緒的情況下也可以保證
-
原子類的作用和鎖類似,是為了保證并發情況下執行緒安全,不過原子類相比于鎖,有一定的優勢
-
粒度更細:原子變數可以把競爭范圍縮小到變數級別,這是我們可以獲得的最細粒度的情況了,通常鎖的力度都要大于原子變數的粒度
-
效率更高:通常,使用原子類的效率會比使用鎖的效率更高,除了高度競爭的情況
6類原子類縱覽:
| Atomic* 基本型別原子類 | AtomicInteger AtomicLong AtomicBoolean |
| Atomic*Array 陣列型別原子類 | AtomicIntegerArray AtomicLongArray AtomicBooleanArray |
| Atomic*Reference 參考型別原子類 | AtomicReference AtomicStampedReference AtomicMarkableReference |
| Atomic*FieldUpdater 升級型別原子類 | AtomicIntegerFieldUpdater AtomicLongFieldUpdater AtomicReferenceFieldUpdater |
| Adder累加器 | LongAdder DoubleAdder |
| Accumulator累加器 | LongAccumulator DoubleAccumulator |
AtomicInteger 常用方法
- public final int get() // 獲取當前的值
- public final int getAndSet(int newValue) // 獲取當前的值,并自增
- public final int getAndDecrement() // 獲取當前的值,并自減
- public final int getAndAdd(int delta) // 獲取當前的值,并加上預期的值
- boolean compareAndSet(int expect, int update) //如果輸入的數值等于預期值,則以原子方式將該值設定為輸入值(update)
/**
* 描述:演示AtomicInteger的基本用法,對比非原子類的執行緒安全問題
* 使用了原子類之后,不需要加鎖,也可以保證執行緒安全問題
*/
public class AtomicIntegerDemo implements Runnable{
public static final AtomicInteger atomicInteger = new AtomicInteger();
public void incrementAtomic(){
atomicInteger.getAndIncrement();
}
public static volatile int basicCount = 0;
public void incrementBasic(){
basicCount++;
}
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
incrementAtomic();
incrementBasic();
}
}
public static void main(String[] args) throws InterruptedException {
AtomicIntegerDemo r = new AtomicIntegerDemo();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("原子類的結果:"+atomicInteger.get());
System.out.println("普通的結果:"+basicCount);
}
}
執行結果:
原子類的結果:20000
普通的結果:19980
AtomicInArray 使用實體:
/**
* 描述:演示原子陣列使用
*/
class AtomicArrayDemo{
public static void main(String[] args) {
AtomicIntegerArray atomicIntegerArray = new AtomicIntegerArray(1000);
Incrementer incrementer = new Incrementer(atomicIntegerArray);
Decrementer decrementer = new Decrementer(atomicIntegerArray);
Thread[] threadsIncrementer = new Thread[100];
Thread[] threadsDecrementer = new Thread[100];
for (int i = 0; i < 100; i++) {
threadsDecrementer[i] = new Thread(decrementer);
threadsIncrementer[i] = new Thread(incrementer);
threadsDecrementer[i].start();
threadsIncrementer[i].start();
}
for (int i = 0; i < 100; i++) {
try {
threadsDecrementer[i].join();
threadsIncrementer[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 0; i < atomicIntegerArray.length(); i++) {
if (atomicIntegerArray.get(i) != 0){
System.out.println("發現了錯誤"+i);
}
}
System.out.println("運行結束");
}
}
class Decrementer implements Runnable{
private AtomicIntegerArray array;
public Decrementer(AtomicIntegerArray array) {
this.array = array;
}
@Override
public void run() {
for (int i = 0; i < array.length(); i++) {
array.getAndDecrement(i);
}
}
}
class Incrementer implements Runnable{
private AtomicIntegerArray array;
public Incrementer(AtomicIntegerArray array) {
this.array = array;
}
@Override
public void run() {
for (int i = 0; i < array.length(); i++) {
array.getAndIncrement(i);
}
}
}
Atomic*Reference 參考型別原子類:
AtomicReference: AtomicReference類的作用和AtomicInteger并沒有本質區別,AtomicInteger可以讓一個整數保證原子性,而AtomicReference可以讓一個物件保證原子性
上一篇的自旋鎖演示就是通過它實作的
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/275406.html
標籤:其他
上一篇:PL/pgSQL撰寫postgresql函式之基本陳述句
下一篇:水杯的測驗用例
