在多个线程上同步var实例化

时间:2013-09-04 13:23:47

标签: java multithreading

我正在尝试同步这样的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 s的单次实例化?也许使用锁?

2 个答案:

答案 0 :(得分:2)

声明s volatile

volatile String s;

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

BTW使用lazy String初始化的例子毫无意义,创建Object

应该是一个昂贵的

答案 1 :(得分:1)

最简单的写作:

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

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

谷歌“双重检查了java中的锁定”,获取了许多关于你可以完成同样事情的方法的信息,但锁定较少(因此可能有更好的性能)。