NullPointerSynced 语句上的异常

2022-09-05 00:32:39

我试图在下面的代码中同步一个对象:

public void myMethod() {
    synchronized (globalObj) {
        //Do something here
    }
}

代码在一个线程中执行。问题是,另一个线程可能会将“globalObj”设置为空。然后,当其他线程将“globalObj”设置为空时,“synchronized (globalObj)”将抛出 NullPointerxception。

在对象上进行同步以使 NullPointerException 不会被抛出的最佳做法是什么?

谢谢。


答案 1

不应在本身可能已更改的引用上进行同步。如果允许另一个线程替换 ,这意味着您可能会对旧线程保持锁定,而另一个线程则在完全不同的线程上工作 - 该锁根本无法帮助您。globalObjglobalObj

相反,您应该为此单独设置一个:Object

static final Object lockObj = new Object();

public void myMethod() {
  synchronized (lockObj) {
    // do something with globalObj here
  }
}

由于永远不会改变,您将始终使用相同的锁 - 没有问题。lockObj


答案 2

无法在引用上进行同步。最佳做法是在对象上进行同步(以确保它永远不会),或者(更好的是)在包中使用更高级别的并发抽象。nullfinalnulljava.util.concurrent


推荐