gpt4 book ai didi

java - Java 中的线程安全双向关联

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:02:22 25 4
gpt4 key购买 nike

什么是实现线程安全双向关联的好方法?是否有好的库或代码生成器?

这是一个非线程安全的例子:

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 个附加字段。 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 可以是任何您想要同步的对象。

关于java - Java 中的线程安全双向关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5069959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com