gpt4 book ai didi

java - 这个 Java 类是否存在可见性风险或线程安全?

转载 作者:行者123 更新时间:2023-11-29 06:30:40 24 4
gpt4 key购买 nike

该类的主要目的是充当事件总线,多个线程可以通过它注册/注销模型。

public class ThreadSafeHash {
private final HashMap<String, LinkedList<Model>> modelMap = new HashMap<>();

public boolean addModel(final String category, final Model model) {
LinkedList<Model> categoryContents = modelMap.get(category);
if (categoryContents == null) {
categoryContents = new LinkedList<>();
modelMap.put(category, categoryContents);
}

synchronized (categoryContents) {
return categoryContents.add(model);
}
}

public boolean removeModel(final Model model) {
LinkedList<Model> categoryContents = modelMap.get(model.getCategory());
if (categoryContents == null) {
return false;
}

synchronized (categoryContents) {
return categoryContents.remove(model);
}
}
}

主要疑惑是多个线程可能会把一个列表放到modelMap但是这个 Action 是不同步的,这会不会引入可见性风险?

最佳答案

这不是线程安全的,因为对 modelMap 的访问不是同步的——但不是因为可见性。

addModel 方法中,两个线程都可以检测到 modelMap.get(category) == null,因此它们都会放入一个新的 LinkedList 进入 map - 一个会踩另一个,所以你会丢失在第一个线程中添加的 model 实例。

发生这种情况是因为“如果不存在则添加”检查不是原子的;并不是说更新不可见。

关于java - 这个 Java 类是否存在可见性风险或线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35172193/

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