zoukankan      html  css  js  c++  java
  • 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 内存模型(主内存,工作内存)

  • 相关阅读:
    indexOf & lastIndexOf
    document.referrer
    函数组合
    v-model绑定vuex中的数据
    图片懒加载
    flex布局问题
    js常见错误类型
    es5/es6继承的区别
    合并两个有序数组
    lettcode 90 子集II
  • 原文地址:https://www.cnblogs.com/zchok/p/11820794.html
Copyright © 2011-2022 走看看