在Java中,当我们想要确保编译器不应该通过保留变量的本地副本来进行优化时,我们将变量设置为volatile。将变量用作volatile可确保线程不使用变量的本地副本,但是它们将使用存储在主存储器中的变量。但是,这是否意味着volatile变量是线程安全的?另外,在原始类型的情况下,如果我们使用用户定义的对象,它有何不同?
答案 0 :(得分:9)
volatile
意味着价值永远是新鲜的;如果另一个线程在您之前将新对象放入变量中,您将看到该对象。
它不会改变值的行为;你不能神奇地使对象成为线程安全的。
答案 1 :(得分:3)
实际上,volatile
意味着值可以被另一个线程同时看到,但是don't
意味着它是线程安全的,它不是线程安全的。
您可以看到:http://java.sun.com/docs/books/jls/third_edition/html/classes.html并找到keyworkd volatile Fields
另请参阅此处:http://www.ibm.com/developerworks/java/library/j-jtp06197/index.html
答案 2 :(得分:0)
volatile变量确保可见性并且不是原子的。
答案 3 :(得分:0)
挥发性通常最适合“简单”状态。防爆。一个布尔成员变量,可以设置为告诉工作线程终止。
答案 4 :(得分:0)
volatile变量的值永远不会在本地存储线程。
所有读取和写入都将转到主存储器中。