Java中的线程安全双向关联

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

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

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可以是您要在其上进行同步的任何对象.

上一篇:linux--VSS/RSS/PSS/USS


下一篇:Elasticsearch 7.9 之 Scalability and resilience:clusters, nodes and shards