gpt4 book ai didi

java - 试图理解接受的答案 - Thread Safe Map of Queues

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

Thread safe Map of Queues

上述问题的设计实现与我自己的非常相似。我明白为什么它不是线程安全的,但公认的“模式”让我陷入困境。我不太明白如何实现它或它与问题的关系。

    boolean send = false;
System.out.println("MailCenter Size Start: " + mailBox.keySet().size());
if (parsedInput.size() == 3) {
for (String s : writers.keySet()) {
if (!s.equals(parsedInput.get(1))) {
send = true;
}
}
if (send) {
mailMessage.add(noAnsiName + ": " + parsedInput.get(2));
mailBox.putIfAbsent(parsedInput.get(1), mailMessage);
System.out.println("Current mail message is: " + mailMessage.peek());
out.println("SERVER You have sent mail to " + parsedInput.get(1) + ".");
}
System.out.println("MailCenter Size Middle: " + mailBox.keySet().size());
} else {
int loop = 0;
for (Map.Entry entry : mailBox.entrySet()) {
System.out.println(entry.getKey() + ":\t" + entry.getValue());
System.out.println("*** LOOP STATUS *** " + loop);
loop++;
}
}

最佳答案

I don't quite get how to implement it or what it does in relationship to the question.

问题表明正在使用 ConcurrentHashMap。但是,变量 map 被声明为 Map,因此接受的答案引用的方法 putIfAbsent() 不可见。

Map<String, ConcurrentLinkedQueue<String>> map = new ConcurrentHashMap<>();

因此,为了使答案有效,必须更改以上内容以将 map 声明为 ConcurrentMap

现在,这是迈向线程安全的重要一步。然而,仅仅因为我们使用并发 map 实现并不意味着 map 上的 get() 和后续的 put() 是一个原子工作单元。换句话说,另一个线程仍然可以在当前线程调用 get() 之后但在调用 put() 之前更改映射的状态。

答案推荐putIfAbsent()因为它通过将等效的 containsKey() 调用和 put() 调用包装在同步块(synchronized block)中来确保原子性。如果您随后也正确使用返回值,您将拥有稳定的并发行为。

关于java - 试图理解接受的答案 - Thread Safe Map of Queues,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28260985/

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