什么是实现线程安全双向关联的好方法?是否有一个好的库或代码生成器?
这是一个非线程安全的例子:
class Foo {
private Foo other;
public Foo getOther() {
return other;
}
public void setOther(Foo other) {
this.setOtherSecretly(other);
other.setotherSecretly(this);
}
void setOtherSecretly(Foo other) {
if (this.other != null) this.other.other = null;
this.other = other;
}
}
我对线程安全的要求是:
- 没有死锁
- 最终一致性(当所有线程停止修改对象时,最终达到一致状态。即,
assert foo.getOther().getOther() == foo
当另一个线程同时执行时失败是可以接受的setOther
。 - 顺序行为。如果一个线程执行
setOther
并且没有其他线程覆盖该值,getOther
则立即返回该线程的新值。 - 没有时光倒流。一旦一个线程用 观察到一个新值
getOther
,它将永远不会再收到旧值(除非它被再次设置)。
也很高兴拥有:
- 低争用,尤其是没有全局锁。该解决方案应该可以很好地扩展。
- 尽可能少的同步开销。对于单个线程,它应该具有合理的性能。
- 低内存开销。当一个对象有 5 个关联时,我不希望每个关联有 3 个附加字段。设置器中的局部变量是可以的。
我的应用程序将有 16 个线程处理多个类的大约 5.000 个对象。
我还没有提出解决方案(不,这不是家庭作业),所以欢迎任何输入(想法、文章、代码)。