我正在尝试同步这样的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的单次实例化?也许使用锁?
答案 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中的锁定”,获取了许多关于你可以完成同样事情的方法的信息,但锁定较少(因此可能有更好的性能)。