Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java volatile是否意味着它是线程安全的_Java_Thread Safety_Compiler Optimization - Fatal编程技术网

Java volatile是否意味着它是线程安全的

Java volatile是否意味着它是线程安全的,java,thread-safety,compiler-optimization,Java,Thread Safety,Compiler Optimization,在Java中,当我们希望确保编译器不应该通过保留变量的本地副本来进行优化时,我们会使变量不稳定。将变量用作volatile可以确保线程不会使用该变量的本地副本,而是使用存储在主内存中的变量。但是,这是否意味着volatile变量是线程安全的?对于原语类型和使用用户定义的对象,它有什么区别?volatile意味着该值始终是新的;如果另一个线程在您之前将一个新对象放入变量中,您将看到该对象 它不会改变值的行为;您无法神奇地使对象线程安全。volatile意味着该值始终是新的;如果另一个线程在您之前将

在Java中,当我们希望确保编译器不应该通过保留变量的本地副本来进行优化时,我们会使变量不稳定。将变量用作volatile可以确保线程不会使用该变量的本地副本,而是使用存储在主内存中的变量。但是,这是否意味着volatile变量是线程安全的?对于原语类型和使用用户定义的对象,它有什么区别?

volatile
意味着该值始终是新的;如果另一个线程在您之前将一个新对象放入变量中,您将看到该对象


它不会改变值的行为;您无法神奇地使对象线程安全。

volatile
意味着该值始终是新的;如果另一个线程在您之前将一个新对象放入变量中,您将看到该对象


它不会改变值的行为;你不能神奇地使一个对象线程安全。

一点也不,事实上,
volatile
意味着另一个线程可以一次看到这个值,但是
意味着它是线程安全的,它不是线程安全的

您可以看到:并找到keyworkd
volatile字段


这里的另一个参考:

一点也不,事实上,
volatile
意味着另一个线程可以立即看到该值,但是
意味着它是线程安全的,它不是线程安全的

您可以看到:并找到keyworkd
volatile字段


另请参阅此处:

volatile变量确保可视性而非原子性。

volatile变量确保可视性而非原子性。

volatile通常最适合“简单”状态。例如,一个布尔成员变量,可以设置为通知工作线程终止。

Volatile通常最适合“简单”状态。例如,可以设置为通知工作线程终止的布尔成员变量。

volatile变量的值永远不会存储在线程本地

所有读写操作都进入主内存


volatile变量的值永远不会存储在线程本地

所有读写操作都进入主内存


Volatile不一定意味着写入主内存。这意味着每个线程将读取最新的值。您可以阅读缓存一致性来了解这是如何可能的Evolatile不一定意味着写入主内存。这意味着每个线程将读取最新的值。您可以读取缓存一致性,以了解这是如何可能的,取决于您所考虑的“值”<代码> Value甚至不保证可变类的新鲜度。如果类是不可变且最终的,那么标记其引用
volatile
将使其线程安全。@yshavit:如果变量是
final
,那么
volatile
将不会有任何区别,好吧。所谓最终类,我的意思是该类被标记为
final
(无法扩展),并不是说它的参考标记为
final
。字段
final List List=ArrayList
不是线程安全的,因为
ArrayList
不是不可变的。但是我指的是
volatile字符串
是线程安全的(不包括其他字段的原子性),因为
String
是不可变的;我误解了你。是的。根据你所考虑的“值”,代码>易失性> /代码>甚至不能保证可变类的新鲜度。如果类是不可变且最终的,那么标记其引用
volatile
将使其线程安全。@yshavit:如果变量是
final
,那么
volatile
将不会有任何区别,好吧。所谓最终类,我的意思是该类被标记为
final
(无法扩展),并不是说它的参考标记为
final
。字段
final List List=ArrayList
不是线程安全的,因为
ArrayList
不是不可变的。但是我指的是
volatile字符串
是线程安全的(不包括其他字段的原子性),因为
String
是不可变的;我误解了你。对