试图理解接受的答案 - Thread Safe Map of Queues
Trying to understand the accepted answer - Thread Safe Map of Queues
Thread safe Map of Queues
上述问题的设计实现与我自己的非常相似。我明白为什么它不是线程安全的,但接受的 "pattern" 让我陷入困境。我不太明白如何实施它或它与问题的关系。
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
。
现在,这是朝着线程安全迈出的重要一步。然而,仅仅因为我们使用并发映射实现并不意味着映射上的 get()
和后续的 put()
是一个原子工作单元。也就是说,另一个线程在当前线程调用get()
之后,但在它调用put()
.
之前,仍然可以改变map的状态
答案推荐 putIfAbsent()
,因为它 通过将 containsKey()
调用和 put()
调用等同的包装在同步中来确保原子性 堵塞。如果您还正确地使用 return 值,您将获得稳定的并发行为。
Thread safe Map of Queues
上述问题的设计实现与我自己的非常相似。我明白为什么它不是线程安全的,但接受的 "pattern" 让我陷入困境。我不太明白如何实施它或它与问题的关系。
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
。
现在,这是朝着线程安全迈出的重要一步。然而,仅仅因为我们使用并发映射实现并不意味着映射上的 get()
和后续的 put()
是一个原子工作单元。也就是说,另一个线程在当前线程调用get()
之后,但在它调用put()
.
答案推荐 putIfAbsent()
,因为它 通过将 containsKey()
调用和 put()
调用等同的包装在同步中来确保原子性 堵塞。如果您还正确地使用 return 值,您将获得稳定的并发行为。