Atomic
java.util.concurrent.atomic提供了一组原子类型操作:
如AtomicInteger提供了
- int addAndGet(int delta)
- int incrementAndGet()
- int get()
- int compareAndGet()
Atomic类可以实现: - 无锁(lock-free)实现的线程安全(thread-safe)访问
原理:CAS(Compare and Set)如果AtomicInteger实例的值是prev,就替换为next,返回true;否则,返回false
public int add1AndGet(AtomicInteger var){ int prev, next; do{ //prev设置为var的值 prev = var.get(); next = prev + 1; }while ( ! var.compareAndSet(prev, next)); //如果var的值是prev,就替换为next,返回true,终止循环;如果var的值不是prev,就什么也不做,返回false,继续循环 //通过compareAndSet就保证了,在do while循环中,即使其他的线程在prev = var.get()后修改了var的值,最终结果也一定是正确的。 return prev; }
通常不需要直接使用do...while..来调用compileAndGet,而是用incrementAndGet()这种封装的方法
AtomicLong var = new AtomicLong(0); public long getNextId(){ //多线程安全的id序列生成器 return var.incrementAndGet(); }
import java.util.concurrent.atomic.AtomicInteger; class Counter{ private AtomicInteger value = new AtomicInteger(); public int add(int m){ return this.value.addAndGet(m); } public int dec(int m){ return this.value.addAndGet(-m); } public int get(){ return this.value.get(); } } public class Main{ final static int LOOP = 100; public static void main(String[] args) throws InterruptedException{ Counter counter = new Counter(); Thread t1 = new Thread(){ public void run(){ for(int i=0;i<LOOP;i++) { counter.add(1); } } }; Thread t2 = new Thread(){ public void run(){ for(int i=0;i<LOOP;i++){ counter.dec(1); } } }; t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(counter.get()); System.out.println("END"); } }
总结:
使用java.util.atomic提供的原子操作可以简化多线程编程
- AtomicInteger/AtomicLong/AtomicArray
- 原子操作实现了无锁的线程安全
- 适用于计数器、累加器
来源:https://www.cnblogs.com/csj2018/p/11018766.html