我有一个螺栓将收集其他螺栓的数据。一旦螺栓中有足够的数据或达到时钟,该螺栓将根据收集的数据执行一些耗时的工作。
我的问题是,在耗时的作业中,其他螺栓应该不断向此螺栓发送数据,这会导致线程安全问题吗?运行耗时作业时是否需要添加锁?
这里也有类似的帖子,但我不明白答案。
考虑到下面的单词计数螺栓,假设它只有一个示例,当一条消息到达这个螺栓时,它将立即确认。因为Map是空的,所以它将启动一个耗时的作业。与此同时,据我所知,其他喷口/螺栓仍在运行,并不断向该螺栓发送消息。但是,由于第一条消息尚未Map,这些新消息将一次又一次地启动耗时的作业。这不会导致线程安全问题吗?
public static class WordCount extends BaseRichBolt {
Map<String, Integer> counts = new HashMap<String, Integer>();
@Override
public void execute(Tuple tuple) {
collect.ack(tuple); // ack upon receiving the message
String word = tuple.getString(0);
Integer count = counts.get(word);
if (count == null){
// doing time-consuming job here
count = 0;
}
count++;
counts.put(word, count);
collector.emit(new Values(word, count));
}
}
1条答案
按热度按时间mqxuamgl1#
防风雨螺栓是螺纹安全的(链接)。在螺栓执行时间转换操作时向螺栓发送数据是可以的。你可以在暴风用户界面中攻击你的箭的能力,如果它挣扎,就增加平行性。