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仅仅是把它所修饰的对象的值让其它线程可见,也就是把当前线程中修改的值从当前线程的寄存器中推送向主内存中,同样,每次读也都是从主内存中读取,由于寄存器级别的访问权限为当前线程,而主内存的访问级别是共享的。这种同步机制,它不提供对锁的独占访问,但可以确保对变量的每一个读取操作都返回最近写入的值。

  • 相关阅读:
    vim配置
    git rebase
    mongodb的docker-compose.yml
    Nginx配置BrowserRouter跟随react-router
    Flux Architecture & Redux Data Flow & redux & react-redux PPT
    from acwing 从算法数量推算算法复杂度
    evalRPN 逆波兰算术
    二分区间
    Flex布局
    Treap 模板
  • 原文地址:https://www.cnblogs.com/azul0906/p/4209634.html
Copyright © 2011-2022 走看看