内存可见volatile

volatile主要保证内存可见

例子:

定义变量底层实现原理:

Java内存模型(JMM)规定了所有的变量都存储在主内存中,主内存中的变量为共享变量,而每条线程都有自己的工作内存,线程的工作内存保存了从主内存拷贝的变量,所有对变量的操作都在自己的工作内存中进行,完成后再刷新到主内存中。

区别在于:

非volatile:读取自己的工作内存(不刷新)

volatile:读取自己的工作内存(是将主内存同步到自己的内存中【也叫所谓的刷新】)

原子性:

其实volatile不能实现原子性:

所有操作都是由(读、写、修改)实现的,想象一下  所谓的原子性 是局部的  ,如果把 读、写、修改 正和成一个事物去处理 就要加锁去处理。

重排序:

所谓重排序只存在于多线程中 举例如下:

public class RecordExample2 {
    int a = 0;
    boolean flag = false;

    /**
     * A线程执行
     */
    public void writer(){
        a = 1;                  // 1
        flag = true;            // 2
    }

    /**
     * B线程执行
     */
    public void read(){
        if(flag){                  // 3
           int i = a + a;          // 4
        }
    }

}

也就是说 i 有可能等于1 或者等于0

这也是volatile的充分体现,也就是上面说的可见性。

别人家的详解:https://www.ibm.com/developerworks/cn/java/j-jtp06197.html

生动详解:https://www.cnblogs.com/MOBIN/p/5407965.html

猜你喜欢

转载自blog.csdn.net/u010310183/article/details/82184837