0

我正在尝试同步一个像这样的 var 实例化:

Object o = new Object();
String s = null;

void getS() {
  if (s != null) {
    return s;
  }
  // multiple threads stopping here
  // maybe using readwritelock? write.lock?
  syncronize(o) {
    // if previous thread stopped by sync block
    // completed before, bypass this
    if (s != null) {
      return s;
    }

    // no one before, instantiate s
    s = "abc";
  }
  return s; 
}

有没有更好的方法来处理 var 的单次实例化?也许使用锁?

4

2 回答 2

2

声明s易失性

volatile String s;

我们将得到一个经典的双重检查锁定设计模式实现。模式是形式化的最佳实践,因此您无需尝试进一步改进此代码。

顺便说一句,惰性字符串初始化的例子没有意义,创建对象应该很昂贵

于 2013-09-04T13:42:49.833 回答
1

最简单的写法:

private Foo foo;
public synchronized Foo getFoo() {
    if (foo == null) {
        foo = new Foo();
    }
    return foo;
}

缺点是每次访问此属性时都会发生同步,即使仅第一次需要同步。

谷歌“在 java 中进行双重检查锁定”以获取有关您可以完成相同事情的方法的大量信息,但锁定更少(因此可能会获得更好的性能)。

于 2013-09-04T13:32:11.623 回答