考虑到的ConcurrentHashMap的javadoc状态:ConcurrentHashMap的迭代guarrantee
“迭代器和枚举的或自创建迭代器的返回在某一点反映 哈希表的状态元素”我想我保证在下面的例子中,一个或两个线程都会调用fireAllFinished()。有没有情况下都不会调用fireAllFinished()?
ConcurrentHashMap<String, Boolean> taskToFinished = new ConcurrentHashMap();
taskToFinished.put("taskA", false);
taskToFinished.put("taskB", false);
public void checkForAllFinished() {
boolean allFinished = true;
for (Boolean taskFinished = tasksToFinished.values()) {
if (!taskFinished) {
allFinished = false;
break;
}
}
if (allFinished) {
fireAllFinished()
}
}
//Thread1
public void run() {
taskToFinished.put("taskA", true);
checkForAllFinished();
}
//Thread1
public void run() {
taskToFinished.put("taskB", true);
checkForAllFinished();
}
(我省略了一些创建线程的代码的希望意图十分明显。)
更新:我已经看到了更一般的问题:Is iterating ConcurrentHashMap values thread safe?,但希望确认我的具体点作为
“在某些点”
通常是一IMP在处理运行代码乱序的多核机器时提出概念,两个线程可能会同时更新映射的不同段,并且设计无法锁定整个ConcurrentHashMap。
此程序不起作用。方法'checkForAllFinished'有一个局部变量'allFinished'。局部变量总是线程安全的,因为它们在堆栈上,而其他线程永远不会看到它们。出于这个原因,你的'checkForAllFinished'方法将不会像你期望的那样工作。如果您将'allFinished'作为实例字段,则需要将其同步或设置为volatile以防止陈旧的数据。 – scottb
@scottb你说的没有错。 – Jason
如果您正在等待完成一组任务,为什么不使用“未来”? – Jason