假设我们有一个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
这个问题在这里已经有了答案:DifferencebetweenvolatileandsynchronizedinJava(4个回答)关闭6年前。我对我读到的关于volatile关键字在java中的应用的内容感到非常困惑。下列说法正确吗?“对volatile字段的写入发生在每次后续读取同一字段之前”理想情况下应该在什么时候使用volatile关键字?有什么区别:classTestClass{privateintx;synchronizedintget(){returnx;}synchronizedvoidset(intx){this.x=x;}}和classTestClass{priva
这个问题在这里已经有了答案:DifferencebetweenvolatileandsynchronizedinJava(4个回答)关闭6年前。我对我读到的关于volatile关键字在java中的应用的内容感到非常困惑。下列说法正确吗?“对volatile字段的写入发生在每次后续读取同一字段之前”理想情况下应该在什么时候使用volatile关键字?有什么区别:classTestClass{privateintx;synchronizedintget(){returnx;}synchronizedvoidset(intx){this.x=x;}}和classTestClass{priva
我知道写入volatile变量会从所有CPU的内存中刷新它,但是我想知道读取volatile变量是否与正常读取一样快?volatile变量是否可以放在cpu缓存中,还是总是从主内存中获取? 最佳答案 你真的应该看看这篇文章:http://brooker.co.za/blog/2012/09/10/volatile.html.博客文章认为,volatile读取(对于x86也是如此)比x86上的非volatile读取要慢得多。测试1是对非volatile变量的并行读写。那里没有可见性机制,读取的结果是可能陈旧。测试2是对volatile
我知道写入volatile变量会从所有CPU的内存中刷新它,但是我想知道读取volatile变量是否与正常读取一样快?volatile变量是否可以放在cpu缓存中,还是总是从主内存中获取? 最佳答案 你真的应该看看这篇文章:http://brooker.co.za/blog/2012/09/10/volatile.html.博客文章认为,volatile读取(对于x86也是如此)比x86上的非volatile读取要慢得多。测试1是对非volatile变量的并行读写。那里没有可见性机制,读取的结果是可能陈旧。测试2是对volatile
我对线程的概念仍然很陌生,并尝试更多地了解它。最近,我在WhatVolatileMeansinJava上看到了一篇博文。杰里米·曼森(JeremyManson)写道:Whenonethreadwritestoavolatilevariable,andanotherthreadseesthatwrite,thefirstthreadistellingthesecondaboutallofthecontentsofmemoryupuntilitperformedthewritetothatvolatilevariable.[...]allofthememorycontentsseenbyT
我对线程的概念仍然很陌生,并尝试更多地了解它。最近,我在WhatVolatileMeansinJava上看到了一篇博文。杰里米·曼森(JeremyManson)写道:Whenonethreadwritestoavolatilevariable,andanotherthreadseesthatwrite,thefirstthreadistellingthesecondaboutallofthecontentsofmemoryupuntilitperformedthewritetothatvolatilevariable.[...]allofthememorycontentsseenbyT