[英]Consume elements from ConcurrentHashMap
我使用ConcurrentHashMap缓冲websocket的消息。
每200ms缓冲区以一个JSON字符串发送一次。 之后,我想从地图中删除该条目。
我猜这是不安全的,因为在foreach期间可能会有新消息发送到缓冲区。
String sendString;
for(String msg : buffer.values()){
sendString += msg;
}
ws.send(sendString);
buffer.clear();
如何安全删除元素?
Map#remove()
返回移除前地图中存在的值。 在ConcurrentHashMap
这是原子执行的,因此您可以安全地使用结果:
StringBuilder sendString = new StringBuilder();
for (String key : buffer.keySet()) {
String s = buffer.remove(key);
if (s != null)
sendString.append(s);
}
您需要检查键和值。
StringBuilder sendString = new StringBuilder();
for (Map.Entry<String, String> entry : buffer.entrySet()) {
sendString.append(entry.getValue());
buffer.remove(entry.getKey(), entry.getValue()); // only remove a matching value
}
明确使用迭代器:
StringBuilder result = new StringBuilder();
for (Iterator<String> it = buffer.values().iterator(); it.hasNext(); ) {
result.append(it.next());
it.remove();
}
将整个方法块放入同步块中。 执行此代码时,没有其他线程可以写入映射。
synchronized(buffer){
String sendString;
for(String msg : buffer.values()){
sendString += msg;
}
ws.send(sendString);
buffer.clear();
}
synchronized(buffer){
buffer.put(key, msg);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.