我们在我们的一个项目中使用volatile来维护不同线程访问的变量的相同副本。我的问题是是否可以将volatile与static一起使用。编译器没有给出任何错误,但我不明白同时使用两者的原因。 最佳答案 内存模型规范阅读不足,推荐阅读http://jeremymanson.blogspot.com/2008/11/what-volatile-means-in-java.html.它由JMM的一位作者撰写,应该可以回答您的问题。根据happens-before考虑内存读取和写入子句也有帮助;Java5及更高版本的JMM向volatil
如果我有这样的代码-longx;x=0xFFFFFFFFL;如果我在32位机器上运行此代码,它是否保证是原子的,或者是否有可能读取x的不同线程可能会获得不完整/垃圾值? 最佳答案 以下是简短摘要:对于引用,读/写是始终原子的(即使在64位实现中!)对于int、char、byte、short、boolean、float,读/写是ALWAYS原子的对于double和long,如果它们是volatile,则读取/写入是ALWAYS原子的因此,只有读/写可能不是原子的异常(exception):对于double和long,如果它们NO被声明
如果我有这样的代码-longx;x=0xFFFFFFFFL;如果我在32位机器上运行此代码,它是否保证是原子的,或者是否有可能读取x的不同线程可能会获得不完整/垃圾值? 最佳答案 以下是简短摘要:对于引用,读/写是始终原子的(即使在64位实现中!)对于int、char、byte、short、boolean、float,读/写是ALWAYS原子的对于double和long,如果它们是volatile,则读取/写入是ALWAYS原子的因此,只有读/写可能不是原子的异常(exception):对于double和long,如果它们NO被声明
假设我们有一个volatileinta.一个线程可以while(true){a=1;a=0;}另一个线程可以while(true){System.out.println(a+a);}现在,JIT编译器发出对应于2*a的程序集是否违法?而不是a+a?一方面,volatile读取的真正目的是它应该始终从内存中读取。另一方面,两次读取之间没有同步点,所以我看不出处理a+a是非法的。原子地,在这种情况下,我看不到诸如2*a之类的优化如何会打破规范。引用JLS将不胜感激。 最佳答案 简短的回答:是的,这种优化是允许的。折叠两个顺序读取操作会产
假设我们有一个volatileinta.一个线程可以while(true){a=1;a=0;}另一个线程可以while(true){System.out.println(a+a);}现在,JIT编译器发出对应于2*a的程序集是否违法?而不是a+a?一方面,volatile读取的真正目的是它应该始终从内存中读取。另一方面,两次读取之间没有同步点,所以我看不出处理a+a是非法的。原子地,在这种情况下,我看不到诸如2*a之类的优化如何会打破规范。引用JLS将不胜感激。 最佳答案 简短的回答:是的,这种优化是允许的。折叠两个顺序读取操作会产
在Java中,我知道volatile关键字提供了变量的可见性。问题是,如果变量是对可变对象的引用,volatile是否也提供对该对象内部成员的可见性?在下面的例子中,如果多个线程访问volatileMutablem并改变value是否正常工作?例子classMutable{privateintvalue;publicintget(){returna;}publicintset(intvalue){this.value=value;}}classTest{publicvolatileMutablem;} 最佳答案 这是对volatil
在Java中,我知道volatile关键字提供了变量的可见性。问题是,如果变量是对可变对象的引用,volatile是否也提供对该对象内部成员的可见性?在下面的例子中,如果多个线程访问volatileMutablem并改变value是否正常工作?例子classMutable{privateintvalue;publicintget(){returna;}publicintset(intvalue){this.value=value;}}classTest{publicvolatileMutablem;} 最佳答案 这是对volatil
在阅读了更多博客/文章等之后,我现在对内存屏障之前/之后的加载/存储行为感到非常困惑。以下是DougLea在他的一篇关于JMM的澄清文章中引用的两句话,这两句话都非常直截了当:线程A在写入volatile字段f时可见的任何内容在线程B读取f时变为可见。请注意,两个线程访问同一个volatile变量以正确设置发生前的关系非常重要。并不是线程A在写入volatile字段f时对它可见的所有内容在它读取volatile字段g后对线程B都是可见的。但是当我查看另一个blog关于内存障碍,我得到了这些:存储屏障,x86上的“sfence”指令,强制屏障之前的所有存储指令发生在屏障之前,并将存储缓冲
在阅读了更多博客/文章等之后,我现在对内存屏障之前/之后的加载/存储行为感到非常困惑。以下是DougLea在他的一篇关于JMM的澄清文章中引用的两句话,这两句话都非常直截了当:线程A在写入volatile字段f时可见的任何内容在线程B读取f时变为可见。请注意,两个线程访问同一个volatile变量以正确设置发生前的关系非常重要。并不是线程A在写入volatile字段f时对它可见的所有内容在它读取volatile字段g后对线程B都是可见的。但是当我查看另一个blog关于内存障碍,我得到了这些:存储屏障,x86上的“sfence”指令,强制屏障之前的所有存储指令发生在屏障之前,并将存储缓冲
这个问题在这里已经有了答案:DifferencebetweenvolatileandsynchronizedinJava(4个回答)关闭6年前。我对我读到的关于volatile关键字在java中的应用的内容感到非常困惑。下列说法正确吗?“对volatile字段的写入发生在每次后续读取同一字段之前”理想情况下应该在什么时候使用volatile关键字?有什么区别:classTestClass{privateintx;synchronizedintget(){returnx;}synchronizedvoidset(intx){this.x=x;}}和classTestClass{priva