zoukankan      html  css  js  c++  java
  • 廖雪峰Java11多线程编程-3高级concurrent包-5Atomic

    1. Atomic

    java.util.concurrent.atomic提供了一组原子类型操作。如AtomicInteger提供了

        int addAndGet(int delta)
        int incrementAndGet()
        int get()
        int compareAndGet()
    

    1.1 无锁线程安全

    Atomic类可以实现无锁(lock-free)的线程安全(thread-safe)访问

    原理:CAS(Compare and Set)如果AtomicInteger实例的值是prev,就替换为next,返回true;否则,返回false

    ```#java /* * 在这个操作中,如果AtomicInteger当前的值是prev,就更新为next,返回true,终止循环; * 如果AtomicInteger当前的值不等于prev,就什么也不做,返回false,继续循环。 */ public int add1AndGet(AtomicInteger var){ int prev, next; do{ prev = var.get(); //之后其他的线程修改了prev的值,也不影响结果 next = prev + 1; }while ( ! var.compareAndSet(prev, next)); return prev; } ``` 利用CAS操作,可以保证,即时在do while循环中,其他的线程在prev = var.get()后修改了AtomicInteger的值,最终结果也一定是正确的。 ### 1.2 incrementAndGet 通常不需要直接使用do...while..来调用compileAndGet,而是用incrementAndGet()这种封装的方法。 ```#java AtomicLong var = new AtomicLong(0); public long getNextId(){ //多线程安全的id序列生成器 return var.incrementAndGet(); } ``` ## 2.示例 ```#java import java.util.concurrent.atomic.AtomicInteger;

    class Counter{
    private AtomicInteger value = new AtomicInteger();
    //add、dec、get不再使用synchronized或ReentrantLock加锁,因为Atomic本身就是原子操作
    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");
    }
    }

    <img src="https://img2018.cnblogs.com/blog/1418970/201906/1418970-20190613170947374-25418412.png" width="500" />
    
    ##    3.总结:
    使用java.util.atomic提供的原子操作可以简化多线程编程
    *    AtomicInteger/AtomicLong/AtomicArray
    *    原子操作实现了无锁的线程安全
    *    适用于计数器、累加器
  • 相关阅读:
    TH-Union教学机 指令总结
    Manjaro 显卡驱动安装
    grub学习内容
    manjaro 折腾
    链栈的实现
    汇编综合实验
    二叉树
    Oracle表空间基本操作
    Windows7/10实现ICMP(ping命令)
    WireShark——IP协议包分析(Ping分析IP协议包)
  • 原文地址:https://www.cnblogs.com/csj2018/p/11018766.html
Copyright © 2011-2022 走看看