我尝试在下面的代码中同步一个对象:
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
永远不会改变,你会始终使用相同的锁-没有问题.
您无法在null
引用上进行同步.最佳实践是在final
对象上进行同步(以确保它永远不会null
),或者(更好地)在java.util.concurrent
包中使用更高级别的并发抽象.
归档时间: |
|
查看次数: |
13357 次 |
最近记录: |