Java中“volatile”的含义是什么?

我们在其中一个项目中使用volatile来维护不同线程访问的变量的相同副本。 我的问题是使用volatilestatic是否可以。 编译器没有给出任何错误,但我不明白使用两者的原因。

如果没有阅读内存模型规范,我建议您阅读http://jeremymanson.blogspot.com/2008/11/what-volatile-means-in-java.html 。 它由JMM的一位作者撰写,应该回答你的问题。 根据before-before子句考虑内存读写也很有帮助; JMM for Java 5以后在volatile之前添加了语义。

具体来说,当您从一个线程读取一个volatile变量时,所有写入(包括从其他线程写入该volatile变量)的所有写入现在都对该一个线程可见。 如果您有时间,可以通过Google技术讲座进一步讨论该主题: https : //code.google.com/edu/languages/#_java_memmodel 。

并且,是的,您可以使用带有volatile static 。 他们做不同的事情。

在Java中,volatile具有与C中类似的一般含义.Java Memory Model(参见ide的答案中的优秀链接)允许线程同时“看到”标记为非易失性的变量的不同值。 例如:

线程a:

 n = 1; // wait... n = 2; 

线程B和C:

 while (true) { System.out.println(name + ": " + n); } 

允许这个输出发生(注意你不能保证在B和C之间严格交替,我只是想在这里显示B和C的“转换”):

 C: 1 B: 1 C: 2 B: 1 C: 2 B: 2 

这与println采取的锁完全分开; 即使C发现它是2,也允许线程B看到n为1.有很多很好的理由让我无法完全理解,许多与速度有关,有些与安全性有关。

如果它是不稳定的,你可以保证(除了println的锁定,我暂时会忽略它),B和C一旦发送它就会“同时”看到B的新值。

你可以使用volatilestatic因为它们会影响不同的东西。 volatile导致将变量“复制”到在使用该变量之前使用该变量的所有线程 ,而static在使用该变量的所有中共享一个变量。 (对于刚接触Java的线程的人来说,这可能会让人感到困惑,因为每个Thread恰好是作为一个class实现的。)

volatile表示变量在运行时更改,并且编译器不应出于任何原因缓存其值。

这在线程之间共享变量时只是一个问题,您不希望线程使用过时数据,因此编译器永远不应该缓存volatile变量引用的值。

Volatile用于许多不同的情况,其中多个线程需要访问同一个变量。 许多没有进行multithreading/并发编程的人不会接触到这一点。 Volatile确保始终从主存储器读取变量,而不是从缓存/寄存器版本读取。 Volatile本身并不是一个锁,只是因为所有线程一旦写入就会看到更改并不意味着您可以以primefaces方式进行比较和交换。 但是,此function可以与其他function一起使用,例如比较和交换,以构建线程安全的数据结构,而不需要用户使用“较重”的java的wait-notify语义。

您可以在此链接获得更多信息http://www.quora.com/Threading-in-Java/What-is-the-purpose-of-the-volatile-keyword-in-java

考虑两个线程(Thread1和Thread2)访问值为1的相同变量“mObject”的情况。

当Thread1运行时,它不期望其他线程修改变量’mObject’。 在这种情况下,Thread1缓存值为1的变量’mObject’。

如果Thread2将’mObject’的值修改为2,那么Thread1仍会将mObject值引用为1,因为它进行了缓存。 为了避免这种缓存,我们应该将变量声明为

private volatile int mObject;

在这个场景中,Thread1将获得mObject的更新值