码迷,mamicode.com
首页 > 编程语言 > 详细

廖雪峰Java11多线程编程-3高级concurrent包-5Atomic

时间:2019-06-13 20:04:03      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:lock   通过   row   system   nal   car   this   dex   java   

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
  • 原子操作实现了无锁的线程安全
  • 适用于计数器、累加器

廖雪峰Java11多线程编程-3高级concurrent包-5Atomic

标签:lock   通过   row   system   nal   car   this   dex   java   

原文地址:https://www.cnblogs.com/csj2018/p/11018766.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!