gpt4 book ai didi

java - 什么应该与 Java 对象同步

转载 作者:行者123 更新时间:2023-11-30 09:39:34 25 4
gpt4 key购买 nike

假设您有 2 个或更多线程共享一个对象 A。

对象A内部有一个列表,其中包含另一个对象B

对象A 列表 对象B

现在线程修改/读取对象 B

问题是,应该同步什么?对象 A,因为他们都访问它,或者对象 B,因为这是他们读取/修改的内容

我似乎无法在任何地方找到我的问题的答案。

提前致谢

最佳答案

走最简单和最安全的路线,您需要在对象层次结构中的最外层对象上进行同步,这应该以原子方式进行操作。

在您的示例中,您似乎需要在列表 上进行同步(不幸的是,如果没有实际代码,我无法确定您真正要做什么)。

示例代码如下:

class B {
}

class A {
private final List<B> listOfBs = new ArrayList<B>();

void add(B b) {
synchronized (listOfBs) {
listOfBs.add(b);
}
}

List<B> getSnapshot() {
List<B> copy = new ArrayList<B>();
synchronized (listOfBs) {
copy.addAll(listOfBs);
}
return copy;
}
}

请注意,您需要将列表声明为 final 以消除某些代码可能更改对违反原子性的列表的引用的可能性:

    // will make add() and getSnapshot() not mutually exclusive, thus violating atomicity of operations 
...
listOfBs = new ArrayList<B>();
...

阅读 Java concurrent programming tutorial会有帮助。

关于java - 什么应该与 Java 对象同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9776960/

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