Java volatile是否意味着它是线程安全的
在Java中,当我们希望确保编译器不应该通过保留变量的本地副本来进行优化时,我们会使变量不稳定。将变量用作volatile可以确保线程不会使用该变量的本地副本,而是使用存储在主内存中的变量。但是,这是否意味着volatile变量是线程安全的?对于原语类型和使用用户定义的对象,它有什么区别?Java volatile是否意味着它是线程安全的,java,thread-safety,compiler-optimization,Java,Thread Safety,Compiler Optimization,在Java中,当我们希望确保编译器不应该通过保留变量的本地副本来进行优化时,我们会使变量不稳定。将变量用作volatile可以确保线程不会使用该变量的本地副本,而是使用存储在主内存中的变量。但是,这是否意味着volatile变量是线程安全的?对于原语类型和使用用户定义的对象,它有什么区别?volatile意味着该值始终是新的;如果另一个线程在您之前将一个新对象放入变量中,您将看到该对象 它不会改变值的行为;您无法神奇地使对象线程安全。volatile意味着该值始终是新的;如果另一个线程在您之前将
volatile
意味着该值始终是新的;如果另一个线程在您之前将一个新对象放入变量中,您将看到该对象
它不会改变值的行为;您无法神奇地使对象线程安全。
volatile
意味着该值始终是新的;如果另一个线程在您之前将一个新对象放入变量中,您将看到该对象
它不会改变值的行为;你不能神奇地使一个对象线程安全。一点也不,事实上,
volatile
意味着另一个线程可以一次看到这个值,但是不
意味着它是线程安全的,它不是线程安全的
您可以看到:并找到keyworkdvolatile字段
这里的另一个参考:一点也不,事实上,
volatile
意味着另一个线程可以立即看到该值,但是不
意味着它是线程安全的,它不是线程安全的
您可以看到:并找到keyworkdvolatile字段
另请参阅此处: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
是不可变的;我误解了你。对