我尝试在下面的代码中同步对象:

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永不更改,因此您将始终使用相同的锁-没问题。

07-24 15:39