一、介紹
1、類的小工具包,支持在單個變量上解除鎖的線程安全編程。此包中的類可 將 volatile 值、字段和數組元素的概念擴展到那些也提供原子條件更新操作的類。
import java.util.concurrent.atomic
2、類 AtomicBoolean、AtomicInteger、AtomicLong 和 AtomicReference 的實例各自提供對 相應類型單個變量的訪問和更新。每個類也爲該類型提供適當的實用工具方法。
3、AtomicIntegerArray、AtomicLongArray和AtomicReferenceArray類進一步擴展了原子操 作,對這些類型的數組提供了支持。
4、 核心方法:boolean compareAndSet(expectedValue, updateValue)
5、java.util.concurrent.atomic包下提供了一些原子操作的常用類:
- AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference
- AtomicIntegerArray、AtomicLongArray
- AtomicMarkableReference
- AtomicReferenceArray
- AtomicStampedReference
二、代碼案例
package com.example.juc;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author haoxiansheng
* i++ 的原子性問題 => 底層 分爲 讀-改=寫
*
*/
public class AtomicDemoTest {
public static void main(String[] args) {
// 產生多線程問題
AtomicDemo atomic = new AtomicDemo();
for (int i = 0; i < 10; i++) {
new Thread(atomic).start();
}
}
}
@Slf4j
class AtomicDemo implements Runnable {
// private int serialNumber = 0;
private AtomicInteger serialNumber = new AtomicInteger();
@Override
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("=>{},serialNumber=>{}", Thread.currentThread().getName(), getSerialNumber());
}
public int getSerialNumber() {
//return serialNumber++;
return serialNumber.getAndIncrement();
}
}