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

原文地址:https://www.cnblogs.com/azul0906/p/4209634.html