我尝试在下面的代码中同步对象:
public void myMethod() {
synchronized (globalObj) {
//Do something here
}
}
该代码在一个线程中执行。问题是,另一个线程可能会将'globalObj'设置为null。然后,当其他线程将“globalObj”设置为null时,“synchronized(globalObj)”将抛出NullPointerxception。
在对象上进行同步以免引发NullPointerException的最佳实践是什么?
谢谢。
最佳答案
您不应在本身可能已更改的引用上进行同步。如果允许另一个线程替换globalObj
,则意味着您可能持有对旧globalObj
的锁定,而另一个线程在完全不同的线程上工作-锁定根本无济于事。
相反,您应该为此使用一个单独的Object
:
static final Object lockObj = new Object();
public void myMethod() {
synchronized (lockObj) {
// do something with globalObj here
}
}
由于
lockObj
永不更改,因此您将始终使用相同的锁-没问题。