Java Volatile

作者: 奔跑的笨鸟 | 来源:发表于2017-06-27 22:07 被阅读47次

    用volatile修饰的变量,其他线程在每次使用这个变量的时候,都会读取变量修改后的最的值。volatile变量每次修改后都会把值从线程本地内存刷新到主内存,读取也一样,每次都从主内存中读取。
    用volatile修改的变量,如果自增减的操作,并不能保证原子性。

    package cn.true123;
    
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    
    public class VolatileTest {
        private volatile int count = 0;
    
        public void increase() {
            count++;
        }
         CountDownLatch countDownLatch = new CountDownLatch(100);
    
        class Increase implements Runnable {
    
            @Override
            public void run() {
                for (int i = 0; i < 100000; i++)
                    increase();
                countDownLatch.countDown();
    
            }
    
        }
        public int getCount(){
            return  count;
        }
    
        public static void main(String[] args) {
    
            ExecutorService executorService = Executors.newCachedThreadPool();
            VolatileTest volatileTest = new VolatileTest();
            for (int i = 0; i < 100; i++) {
                Runnable runnable = volatileTest.new Increase();
                executorService.execute(runnable);
            }
            try {
                volatileTest.countDownLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("=="+volatileTest.getCount());
        }
    
    }
    
    

    执行结果:

    ==9999615
    

    可见volatile变量,能保证对线程可见性,不能保证原子性。

    相关文章

      网友评论

        本文标题:Java Volatile

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