1

当 java 线程相互通信但不需要显式同步时(因此不需要在对象上调用 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”方法调用传递一些构造对象可能存在潜在的可见性问题,这些构造对象可能在接收线程中以正确的方式不可见(例如,陈旧的值),对吧?如果是,如何在不使用同步的情况下强制可见性?

谢谢。

4

2 回答 2

4

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

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

于 2013-01-13T18:00:43.800 回答
0

不要害怕同步,如果同步块小而快,这在你的情况下是正确的,lock-unlock 不会引起任何问题。

您可以使用“无锁”并发数据结构,例如 ConcurrentLinkedQueue。(你的情况不会快很多)

编辑:看起来您担心传递给的参数的可见性handle(),而不是处理程序本身。

于 2013-01-13T18:22:42.947 回答