什么是实现线程安全的双向关联的好方法?也许有一个好的库或代码生成器?
这是一个非线程安全的示例:
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;
}
}
我对线程安全性的要求是:
>没有僵局
>最终一致性(当所有线程停止修改对象时,最终会达到一致状态.即,当另一个线程同时执行setOther时,断言foo.getOther().getOther()== foo失败是可以接受的.
>顺序行为.如果一个线程执行setOther并且没有其他任何线程重写该值,则getOther立即返回该线程的新值.
>没有时光倒流.一旦线程使用getOther观察到新值,它将永远不会再收到旧值(除非再次设置它).
也很高兴:
>低争用,尤其是没有全局锁定.解决方案应该很好地扩展.
>尽可能少的同步开销.对于单个线程,它应该具有合理的性能.
>低内存开销.当一个对象有5个关联时,我不需要每个关联3个附加字段. setter中的局部变量是可以的.
我的应用程序将有16个线程在多个类的约5.000个对象上工作.
我还没有一个解决方案(不,这不是功课),因此欢迎任何输入(思想,文章,代码).
解决方法:
Google Guava为您执行此操作:BiMap.
例如:
BiMap<Integer, String> bimap = Synchronized.biMap(HashBiMap.create(), someMutexObject);
bimap.put(1, "one");
bimap.put(2, "two");
bimap.get(1); // returns "one"
bimap.inverse().get("one") // returns 1
someMutexObject可以是您要在其上进行同步的任何对象.