zoukankan      html  css  js  c++  java
  • volatile关键字

      volatile关键字用到java用到目前还没用到过,但是阅读源代码的时候经常可以看到,之前也稍微百度了一下,但是总是不得要领。今天在看java-并发实践的时候总算是完全搞清楚了。话不多说,先上代码:

    package test.lan;
    
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class ff {
        private volatile static int ijk = 0;
    //    private static int ijk = 0;
        private static CountDownLatch count = new CountDownLatch(10000);
        private static ExecutorService executor = Executors.newFixedThreadPool(1000);
        public static void main(String[] args) {
            for(int i =0;i<10000;i++){
    //            new Thread(new Runnable() {
    //                public void run() {
    //                    ijk++;
    //                    count.countDown();
    //                }
    //            }).start();
                executor.submit(new Runnable() {
                    public void run() {
                        ijk++;
                        count.countDown();
                    }
                });
            }
            try {
                count.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("ijk: "+ijk);
            executor.shutdown();
        }
    }

    ijk: 9999

      这里的操作比较简单,通常一个线程会在很短的时间内完成,但是并不能保证ijk结果每次都会是10000,加volatile并不能保证ijk是线程安全的。结合教程和网络文章关于jvm内存管理模型的解释,volatile仅仅是把它所修饰的对象的值让其它线程可见,也就是把当前线程中修改的值从当前线程的寄存器中推送向主内存中,同样,每次读也都是从主内存中读取,由于寄存器级别的访问权限为当前线程,而主内存的访问级别是共享的。这种同步机制,它不提供对锁的独占访问,但可以确保对变量的每一个读取操作都返回最近写入的值。

  • 相关阅读:
    poj 1860 Currency Exchange(最短路径的应用)
    poj 2965 The Pilots Brothers' refrigerator
    zoj 1827 the game of 31 (有限制的博弈论)
    poj 3295 Tautology (构造法)
    poj 1753 Flip Game(枚举)
    poj 2109 (贪心)
    poj 1328(贪心)
    Qt 对单个控件美化
    Qt 4基础
    Bash Shell
  • 原文地址:https://www.cnblogs.com/azul0906/p/4209634.html
Copyright © 2011-2022 走看看