[英]Java thread visibility - best practice for visibility without explicit synchronization
让java Threads相互通信,但不需要显式同步(因此不需要在对象上调用synchronize来同步执行),确保所涉及线程之间的适当可见性的最佳做法是什么?
例如:
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);
}
}
}
如果我没有弄错,那么处理程序“handle”方法调用有一个潜在的可见性问题,它会传递一些构造对象,然后在接收线程中可能看不到正确的方式(例如陈旧的值),对吗? 如果是,如何在不使用synchronized的情况下强制可见性?
谢谢。
应该可以使用volatile修饰符,但是我建议使用AtomicReference
此外,如果你传递一个不可变的对象 - 那么根本就不会出现问题,因为在构造函数结束执行之前,保证最终字段被初始化。
不要害怕同步,如果同步块小又快,这在你的情况下是正确的,锁定解锁不会导致任何问题。
您可以使用“无锁”并发数据结构,如ConcurrentLinkedQueue。 (对你的情况来说,速度不会太快)
编辑:看起来你担心传递给handle()
的参数的可见性,而不是处理程序本身。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.