同步语句

| 我尝试在下面的代码中同步对象:
public void myMethod() {
    synchronized (globalObj) {
        //Do something here
    }
}
该代码在一个线程中执行。问题是,另一个线程可能会将\'globalObj \'设置为null。然后,当其他线程将\'globalObj \'设置为null时,\'synchronized(globalObj)\'将抛出NullPointerxception。 在对象上进行同步以免引发NullPointerException的最佳实践是什么? 谢谢。     
已邀请:
        您不应在本身可能已更改的参考上进行同步。如果允许另一个线程替换
globalObj
,则意味着您可能持有旧
globalObj
的锁,而另一个线程在完全不同的线程上工作-锁根本无法帮助您。 为此,您应该做一个单独的ѭ3::
static final Object lockObj = new Object();

public void myMethod() {
  synchronized (lockObj) {
    // do something with globalObj here
  }
}
由于
lockObj
永远不变,因此您将始终使用相同的锁-没问题。     
        您无法在
null
参考上进行同步。最佳实践是在
final
对象上同步(以确保它永远不会是
null
),或者(更好)使用
java.util.concurrent
包中的更高级别的并发抽象。     
        确保在不可以为null的对象上同步... 为什么将ѭ1设置为null?并发语义应该是什么?是偶然吗? 如果有时锁定的必要性消失了(虽然看起来很怪异),则可以添加一个空检查(当然,您需要同步其他操作,以避免先检查空然后将其设置为之后立即返回null)。 请更详细地描述您的方案。     
        创建一个没有任何公共设置器的私有对象类成员,并对其进行锁定。     

要回复问题请先登录注册