美文网首页
原子操作类AtomicInteger

原子操作类AtomicInteger

作者: 陈萍儿Candy | 来源:发表于2020-10-30 08:31 被阅读0次

    对于Java中的运算操作,例如自增或自减,若没有进行额外的同步操作,在多线程环境下就是线程不安全的。num++解析为num=num+1,明显,这个操作不具备原子性,多线程并发共享这个变量时必然会出现问题。测试代码如下:

    class AtomicIntegerTest {
    
        private static final int THREADS_COUNT = 20;
    // 加volatile不管用
    //    public static volatile int count = 0;
    // 原子操作
        public static AtomicInteger count = new AtomicInteger(0);
    
        public static void increase() {
    //        count++;
            count.incrementAndGet();
        }
    
    
        public static void main(String[] args) {
            Thread[] threads = new Thread[THREADS_COUNT];
            for (int i = 0; i < THREADS_COUNT ;i++) {
                threads[i] = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        for (int i = 0; i < 1000; i++) {
                            increase();
                        }
                    }
                });
                threads[i].start();
            }
    
            int i = Thread.currentThread().getThreadGroup().activeCount();
            int activeCount = Thread.activeCount();
            System.out.println("i:"+i+",activeCount:"+activeCount);
    
    
            while (Thread.activeCount() > 2) {
                Thread.yield();
            }
    
            int jieshu = Thread.currentThread().getThreadGroup().activeCount();
            System.out.println("jieshu:"+jieshu+",activeCount:"+Thread.activeCount());
    
            System.out.println(count);
        }
    }
    

    这里运行了20个线程,每个线程对count变量进行1000此自增操作,如果上面这段代码能够正常并发的话,最后的结果应该是20000才对,

    不用AtomicInteger,用volatile修饰的count,运行结果总是一个小于20000的数字;

    去掉volatile也是这样,换成AtomicInteger每次运行结果就是20000;

    volatile的特性:
    1、保证变量在线程间可见,对volatile变量所有的写操作都能立即反应到其他线程中,换句话说,volatile变量在各个线程中是一致的(得益于java内存模型—"先行发生原则");

    2、禁止指令的重排序优化;

    结论:基于volatile变量的运算在并发下是安全的,因为核心点在于java里的运算(比如自增)并不是原子性的。

    问题:什么是原子性操作

    有几个新的概念,非阻塞同步????CAS指令(Compare-And-Swap比较并交换),Unsafe类的CAS操作????
    同步:多线程并发访问共享数据时,保证共享数据再同一时刻只被一个或一些线程使用。
    相关文章:https://blog.csdn.net/fanrenxiang/article/details/80623884

    相关文章

      网友评论

          本文标题:原子操作类AtomicInteger

          本文链接:https://www.haomeiwen.com/subject/mvpxvktx.html