繁体   English   中英

消耗ConcurrentHashMap中的元素

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM