我经常看到这样的代码:

Listener mListener;

public void setListener(Listener listener){
   mListener=listener;
}

public void fooFunction(){
   ...
   ...
   if (mListener!=null){
      mListener.notifyFoo();
   }
}

我的问题是:如果在空检查和notifyfoo()之间,另一个线程调用setListener(空),会怎么样?有可能吗?或者编译器使它成为原子的

最佳答案

可以同步方法

public synchronized void setListener(Listener listener){
   mListener=listener;
}

public synchronized void fooFunction(){
   ...
   ...
   if (mListener!=null){
       mListener.notifyFoo();
   }
}

或者如果您想要更好的锁粒度
private Object monitor = new Object();

public void setListener(Listener listener){
   synchronized (monitor) {
       mListener=listener;
   }
}

public void fooFunction(){
   ...
   ...
   synchronized (monitor) {
        if (mListener!=null){
           mListener.notifyFoo();
       }
   }
}

07-24 09:26