1

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

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

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

2 回答 2

0

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

于 2012-06-11T21:42:11.393 回答
0

不会。变量的分配可能发生在您检查之后但在您获得锁定之前。

曾经有一种观点认为同步锁很昂贵,但现在不是这样了。抓住锁就行了。

于 2012-06-11T21:43:44.373 回答