`volatile Double`的跨线程可见性

时间:2016-10-25 23:31:50

标签: java double volatile

volatile Double是否具有volatile double具有的跨线程可见性?

来自Java Tutorials at Oracle的内容如下:

  

使用volatile变量可降低内存一致性的风险   错误,因为对volatile变量的任何写入都会建立一个   在与之后的相关读取之前发生   变量。这意味着始终对volatile变量进行更改   其他线程可见。更重要的是,这也意味着当a   线程读取一个volatile变量,它不仅看到最新的变化   对于挥发性,还有导致代码的副作用   变化

它似乎取决于Double是一种特殊的对象还是一个对它没什么特别的对象。

2 个答案:

答案 0 :(得分:0)

volatile Double bigD = new Double(1.0); 
bigD = 2.0;
正如jtahlborn所指出的,

Double是一个不可改变的类。原始对象实例没有更改,因为它是不可变的。对bigD的更改必然是参考更改。该更改受益于volatile声明引起的跨线程可见性。

A list of Java immutables.

Examples of Java immutables.

答案 1 :(得分:-1)

是的,当任何线程随后访问该变量时,无论变量是基本类型还是引用类型,都可以保证在一个线程中看到对volatile变量的更改。但是,这 not 会阻止线程同步问题 - 您仍必须确保两个线程不会同时尝试更改变量。