AtomicInteger原子类,计数器使用

原子性(Atomicity)

        原子性,指的是一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程打断。

i++不具有原子性

  i++执行是会分为三个阶段,这三个阶段中间都可以被中断分离开.

  内存到寄存器
  寄存器自增
  写回内存


若A、B两个线程通信,必须经过

  A线程把变量从工作内存写到主内存,B线程从主内存读到自己的工作内存

每个线程都有自己的工作内存,主内存只有一个,工作内存直接不能直接通信,只能借助于主内存。

public class Test1 {

    private static int num = 0;

//    private volatile static int num = 0;

    private static AtomicInteger atomic = new AtomicInteger(0);

    public static void increase(){
        for (int i = 0; i < 1000; i++) {
//            num ++;
            atomic.incrementAndGet();
        }

    }

    public static void main(String[] args) {

        for (int i = 0; i < 20; i ++){
            new Thread(()->{
                increase();
            }).start();
        }
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(atomic.get());
    }
}

使用volatile关键字修饰也会出现线程安全问题,原因,volatile解决的是多线程间共享变量的可见性问题,而保证不了多线程间共享变量原子性问题

参考资料

  https://blog.csdn.net/zbw18297786698/article/details/53420780

  JAVA 内存模型(主内存,工作内存)

原文地址:https://www.cnblogs.com/zchok/p/11820794.html