gpt4 book ai didi

Java 线程可见性 - 无需显式同步的可见性最佳实践

转载 作者:行者123 更新时间:2023-11-29 03:38:26 24 4
gpt4 key购买 nike

当 java 线程彼此通信时,但不需要显式同步(因此无需在对象上调用同步来同步执行),确保相关线程之间适当可见性的最佳实践是什么?

例如:

class B extends Thread {
...
A instanceOfA = ...;

B(){
instanceOfA.registerHandler(new Handler(){
@Override
handle(SomeObjectToBeVisibile o){
...
}
});
}
}

class A extends Thread {
...
void registerSomeHandlerMethod(HandlerMethod handler){...}

void executeHandlers(){
for(each registered handler){
handler.handle(instanceOfSomeObjectToBeVisible);
}

}
}

如果我没记错的话,传递一些构造对象的处理程序“处理”方法调用存在潜在的可见性问题,然后在接收线程中可能无法以正确的方式可见(例如,陈旧的值),对吗?如果是,如何在不使用同步的情况下强制可见性?

谢谢。

最佳答案

应该可以使用 volatile 修饰符,但我建议使用 AtomicReference

此外,如果您要传递一个不可变的对象 - 那么根本不会出现任何问题,因为 final 字段保证在构造函数结束它的执行之前被初始化。

关于Java 线程可见性 - 无需显式同步的可见性最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14306374/

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