一、介绍
1、简介
Atomic
是JUC提供的一组原子操作的封装类,它们位于java.util.concurrent.atomic
中。Atomic包一共提供了13个类。
2、原理
Atomic包中的类基本的特性就是在多线程环境下,当有多个线程同时对单个(包括基本类型及引用类型)变量进行操作时,具有排他性,即当多个线程同时对该变量的值进行更新时,仅有一个线程能成功,而未成功的线程可以向自旋锁一样,继续尝试,一直等到执行成功。
Atomic类
是通过无锁(lock-free)的方式实现的线程安全(thread-safe)访问。它的主要原理是利用了CAS(Compare and Set)。
二、原子更新基本类型类
1、AtomicInteger
增加值并返回新值:int addAndGet(int delta)
加1后返回新值:int incrementAndGet()
获取当前值:int get()
用CAS方式设置:int compareAndSet(int expect, int update)
demo:
public class D01_AtomicInteger {
AtomicInteger count = new AtomicInteger(0);
void m1() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
count.incrementAndGet();
}
}
public static void main(String[] args) {
D01_AtomicInteger t = new D01_AtomicInteger();
List<Thread> threads = new ArrayList<>();
for (int i = 0; i < 10; i++) {
threads.add(new Thread(t::m1,"thread" + i));
}
threads.forEach((o) -> o.start());
threads.forEach(o -> {
try {
o.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println(t.count); // 1000
}
}
创建10个线程,每个线程循环100次incrementAndGet()
操作,输出预期结果1000,证明Atomic确实可以保证线程安全。