Java易失性并发

好的,我只是读了这个问题您是否曾在Java中使用volatile关键字? ,我使用volatile变量来停止循环。 我也看过这个参考资料, http://www.javamex.com/tutorials/synchronization_volatile.shtml 。 现在文章说波动变量是非阻塞的。 它还说它不能用于读取 – 更新 – 写入序列中的并发性。 这是有道理的,因为它们是非阻塞的。

由于从不缓存volatile变量,因此简单地使用同步来停止循环(来自早期链接)会更快吗?

编辑:使用同步解决方案

public class A{ private boolean test; public A(){ test = true; } public synchronized void stop(){ test = false; } public synchronized boolean isTrue(){ return test; } } public class B extends Thread { private A a; public B(A refA){ a = refA; } public void run(){ //Does stuff here try{ sleep(1000); } catch(Exception e){} a.stop(); } public static void main(String [] args){ A TestA = new A(); B TestB = new B(TestA); TestB.start(); while(TestA.isTrue()){ //stay in loop System.out.println("still in loop"); } System.out.println("Done with loop"); } } 

不,读取volatile变量比读取synchronized块中的volatile变量要快。

synchronized块清除条目上的缓存值,这与读取volatile变量相同。 但是,当退出同步块时它还会刷新对主内存的任何缓存写入,这在读取volatile变量时不是必需的。

你的问题中有很多问题:只要你使用Atomic*FieldUpdater和一个cas-loop,你就可以使用volatile进行可靠的read-update-write。 Volatiles可以“缓存”,它们只需要遵守指定的相关发生之前的语义。

同步通常涉及获得锁,这相对昂贵(尽管实际上可能非常便宜)。 简单的并发优化可能使用非天真的实现技术。