gpt4 book ai didi

Java 不稳定的并发性

转载 作者:太空宇宙 更新时间:2023-11-04 10:33:58 24 4
gpt4 key购买 nike

好的,我刚刚读了这个问题 Do you ever use the volatile keyword in Java? ,并且我使用 volatile 变量来停止循环。我也看过这个引用文献,http://www.javamex.com/tutorials/synchronization_volatile.shtml 。现在文章说 volatile 变量是非阻塞的。它还表示它不能用于读-更新-写序列中的并发。这是有道理的,因为它们是非阻塞的。

由于 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 变量比读取同步 block 中的非 volatile 变量要快。

同步块(synchronized block)会清除条目上的缓存值,这与读取 volatile 变量相同。 但是,当退出同步块(synchronized block)时,它还会将所有缓存的写入刷新到主内存,这在读取 volatile 变量时是不必要的。

关于Java 不稳定的并发性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49679217/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com