volatile java?volatile内存屏障原理
- 开发语言
- 2023-08-13
- 78
大家好,关于volatile java很多朋友都还不太明白,今天小编就来为大家分享关于volatile内存屏障原理的知识,希望对各位有所帮助!java编程,如何彻底理解...
大家好,关于volatile java很多朋友都还不太明白,今天小编就来为大家分享关于volatile内存屏障原理的知识,希望对各位有所帮助!
java编程,如何彻底理解volatile关键字
volatile在Java语言中扮演者重要的角色,它具有可见性以及禁止指令重排序两个非常显著的特点,要想解释清楚volatile的用法,首先我们要对Java的内存模型JMM有一个非常熟悉的了解,所以我从以下几点来分析volatile。
一、Java内存模型JMMJava的内存模型规定:所有的变量都保存在主内存中,每一个线程都有属于自己的工作内存,当读取主内存的变量时,线程的工作内存都会都会存储这个变量的副本,线程对变量的操作都是在自己的工作内存中,在适当的时候会把自己工作内存的变量同步到主内存中。
从上面的内容中可以得出一个结论,多线程对变量的修改,都是先修改自己的工作内存的变量,然后把工作内存中修改的在适当的时候同步到主内存中,那么问题就来了,适当的时候是什么时候呢?不确定,所以就有问题了,当主内存中有一个变量i=0,假如同时有两个线程去修改i的值,当线程1读取主内存中的i=1,然后拷贝一份副本在自己的工作内存中,然后i=1,但是这是操作的自己的工作内存i=1,但是这个i=1什么时候刷新到主内存中呢?刚才我们说了,不确定,此时线程二读取主存的变量i=0,然后也拷贝一份到自己的工作内存中,然后i=2,然后在适当的时候刷新到主存中,所以最终的结果可能是线程二i=2的结果先刷新到主存中,线程一i=1最后刷新到主存中,这就导致现在主存中i=1,所以与想象的结果不一样。
二、volatile的大白话了解了Java的内存模型JMM,我们了解了对于一个共享变量,如果有多个线程并发的修改这个共享变量,最终得到的结果可能与我们想象的不太一样,这是由于JMM的机制导致的,而这和我们所说的volatile有什么关系的,那接下来我们就说说。
结论:1:如果一个变量被volatile修饰,那么它在工作内存中修改的变量会立刻被刷新到主存中。而不是上面所说的不确定的时候
2:如果读取一个被volatile修饰的变量,会把此线程工作内存中的此变量副本置为无效,它会从主内存中重新读取这个变量到自己的工作内存。
上面这两点分别是volatile写内存语义和volatile内存语义。
三、volatile在JDK的使用在JDK中,并发包中volatile把它的特点发挥到了极致,尤其通过框架AQS的state就是被volatile修饰的,在加上CAS构建出了无锁化的同步框架,在ConcurrentHashMap中也是因为有了volatile的作用加上CAS操作提高了很大的性能。
上面3点只是简单的说明了volatile的作用,如果要详细介绍volatile,估计能够一本上百页的书了,在这里就不再详述了,如果想进一步了解volatile,请关注我的头条,我会有一个关于volatile的专题。
static和Volatile的区别
变量放在主存区上,使用该变量的每个线程,都将从主存区拷贝一份到自己的工作区上进行操作。
volatile,声明这个字段易变(可能被多个线程使用),Java内存模型负责各个线程的工作区与主存区的该字段的值保持同步,即一致性。
static,声明这个字段是静态的(可能被多个实例共享),在主存区上该类的所有实例的该字段为同一个变量,即唯一性。
volatile,声明变量值的一致性;static,声明变量的唯一性。
此外,volatile同步机制不同于synchronized,前者是内存同步,后者不仅包含内存同步(一致性),且保证线程互斥(互斥性)。
static只是声明变量在主存上的唯一性,不能保证工作区与主存区变量值的一致性;除非变量的值是不可变的,即再加上final的修饰符,否则static声明的变量,不是线程安全的。
下面摘自Java语言规范(JavaLanguageSpecification)的官方解释:
1)Ifafieldisdeclaredstatic,thereexistsexactlyoneincarnationofthefield,nomatterhowmanyinstances(possiblyzero)oftheclassmayeventuallybecreated.
2)Afieldmaybedeclaredvolatile,inwhichcasetheJavaMemoryModelensuresthatallthreadsseeaconsistentvalueforthevariable。
好了,关于volatile java和volatile内存屏障原理的问题到这里结束啦,希望可以解决您的问题哈!
本文链接:http://www.xinin56.com/kaifa/7748.html