我可以在java中的同步块之外的共享字段上检查null吗?

我可以在java中的同步块之外的共享字段上检查null吗?,java,multithreading,synchronization,thread-safety,synchronized,Java,Multithreading,Synchronization,Thread Safety,Synchronized,假设我有一个字段,可以由两个单独的线程访问。我正在使用一个对象作为同步锁。我是否可以检查同步块之外的null?换句话说,此线程是否安全: private Object sharedObject() = new Object(); private final Object sharedObjectLock() = new Object(); private void awesomeMethod() { if(sharedObject != null) { synchronize

假设我有一个字段,可以由两个单独的线程访问。我正在使用一个对象作为同步锁。我是否可以检查同步块之外的
null
?换句话说,此线程是否安全:

private Object sharedObject() = new Object();
private final Object sharedObjectLock() = new Object();

private void awesomeMethod() {
   if(sharedObject != null) {
      synchronized(sharedObjectLock) {
         //code the uses sharedObject
      }
   }
}

不,它不是线程安全的。如果另一个线程使
sharedObject
字段为空,则不能保证您的线程看到该更改。

否。变量的赋值可能发生在您检查之后,但在获得锁之前


曾经有一个学派认为同步锁很昂贵,但现在已经不是这样了。抓住锁。

没有提供足够的信息。
sharedObject
如何在这个类中使用?此外,代码并不像最初编写的那样编译。构建对象时,
sharedObject
sharedObjectLock
是否初始化?或者,
sharedObject
稍后是否由另一种方法初始化?
sharedObject
在使用非空值初始化后是否可以设置为空?这一点很好。这一学派的思想正在我脑海中闪现,如果对象为空,我不想抓住锁。