我经常看到这样的代码:
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();
}
}
}