同步语句的NullPointerException

Kai*_*Kai 10 java

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

public void myMethod() {
    synchronized (globalObj) {
        //Do something here
    }
}
Run Code Online (Sandbox Code Playgroud)

代码在一个线程中执行.问题是,另一个线程可能将'globalObj'设置为null.然后,当'globalObj'被其他线程设置为null时,'synchronized(globalObj)'将抛出NullPointerxception.

同步对象的最佳做法是什么,因此不会抛出NullPointerException?

谢谢.

bdo*_*lan 28

您不应该在可能更改的引用上进行同步.如果允许替换另一个线程globalObj,这意味着您可以保持对旧的锁定,globalObj而另一个线程在完全不同的线程上工作 - 锁定对您没有任何帮助.

你应该做的是Object为此目的单独分开:

static final Object lockObj = new Object();

public void myMethod() {
  synchronized (lockObj) {
    // do something with globalObj here
  }
}
Run Code Online (Sandbox Code Playgroud)

因为lockObj永远不会改变,你会始终使用相同的锁-没有问题.


Dan*_*iel 6

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