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

Posted csj2018

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了廖雪峰Java11多线程编程-3高级concurrent包-5Atomic相关的知识,希望对你有一定的参考价值。

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的主要内容,如果未能解决你的问题,请参考以下文章

廖雪峰Java11多线程编程-4线程工具类-1ThreadLocal

廖雪峰Java11多线程编程-2线程同步-2synchronized方法

廖雪峰Java13网络编程-1Socket编程-3TCP多线程编程

20200225 Java 多线程-廖雪峰

20200225 Java 多线程-廖雪峰

廖雪峰Java13网络编程-3其他-1HTTP编程