我经常看到这样的代码:
Listener mListener;
public void setListener(Listener listener){
mListener=listener;
}
public void fooFunction(){
...
...
if (mListener!=null){
mListener.notifyFoo();
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:如果在null检查和notifyFoo()之间另一个线程调用setListener(null)怎么办?那可能吗?或者编译器是否使其具有原子性
您可以同步方法
public synchronized void setListener(Listener listener){
mListener=listener;
}
public synchronized void fooFunction(){
...
...
if (mListener!=null){
mListener.notifyFoo();
}
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您想要更好的锁定粒度
private Object monitor = new Object();
public void setListener(Listener listener){
synchronized (monitor) {
mListener=listener;
}
}
public void fooFunction(){
...
...
synchronized (monitor) {
if (mListener!=null){
mListener.notifyFoo();
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1263 次 |
| 最近记录: |