廖雪峰Java11多线程编程-3高级concurrent包-5Atomic
2020-12-13 01:54
标签:lock 通过 row system nal car this dex java java.util.concurrent.atomic提供了一组原子类型操作: 通常不需要直接使用do...while..来调用compileAndGet,而是用incrementAndGet()这种封装的方法 使用java.util.atomic提供的原子操作可以简化多线程编程 廖雪峰Java11多线程编程-3高级concurrent包-5Atomic 标签:lock 通过 row system nal car this dex java 原文地址:https://www.cnblogs.com/csj2018/p/11018766.htmlAtomic
如AtomicInteger提供了
Atomic类可以实现:
原理:CAS(Compare and Set)如果AtomicInteger实例的值是prev,就替换为next,返回true;否则,返回falsepublic 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;
}
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
总结:
文章标题:廖雪峰Java11多线程编程-3高级concurrent包-5Atomic
文章链接:http://soscw.com/essay/24454.html