AtomicInteger

保持线程运算的原子性:一般常见的算法存在不安全行
  

import java.util.concurrent.atomic.AtomicInteger;

atomic:提供的一些保持原子性算法:
原理解析:
   public final int getAndIncrement() {
    for (;;) {
        int current = get();//取出atomic容器中的值
        int next = current + 1;
        if (compareAndSet(current, next))//类似CAS锁
            return current;
    }
}


CAS算法即是:Compare And Swap,比较并且替换;

    CAS算法存在着三个参数,内存值V,旧的预期值A,以及要更新的值B。当且仅当内存值V和预期值B相等的时候,才会将内存值修改为B,否则什么也不做,直接返回false;

    比如说某一个线程要修改某个字段的值,当这个值初始化的时候会在内存中完成,根据Java内存模型,该线程保存着这个变量的一个副本;当且仅当这个变量的副本和内存的值如果相同,那么就可以完成对值得修改,并且这个CAS操作完全是原子性的操作,也就是说此时这个操作不可能被中断。



public final int getAndSet(int newValue)                                      //给AtomicInteger设置newValue并返回加oldValue
public final boolean compareAndSet(int expect, int update)    //如果输入的值和期望值相等就set并返回true/false
public final int getAndIncrement()                                                 //对AtomicInteger原子的加1并返回当前自增前的value
public final int getAndDecrement()                                              //对AtomicInteger原子的减1并返回自减之前的的value
public final int getAndAdd(int delta)                                             //对AtomicInteger原子的加上delta值并返加之前的value
public final int incrementAndGet()                                                //对AtomicInteger原子的加1并返回加1后的值
public final int decrementAndGet()                                               //对AtomicInteger原子的减1并返回减1后的值
public final int addAndGet(int delta)                                             //给AtomicInteger原子的加上指定的delta值并返回加后的值

example:
  

public class AtomicMethod implements Runnable{
    AtomicInteger a;
    public AtomicMethod(AtomicInteger a) {
        this.a = a;
    }
    @Override
    public void run() {
        for (int i = 0;i<1000;i++){
            a.incrementAndGet();
        }
        System.out.println(a);
    }
}


public static AtomicInteger a=new AtomicInteger(0);
   
public static void main(String[] args) {
      AtomicMethod atomic=new AtomicMethod(a);
      Thread t2 = new Thread(atomic, "二线程");
      t2.start();
      System.out.println(atomic);
   }


return:1000

你可能感兴趣的:(开发问题总览)