Учитывая ConcurrentHashMap JavaDocs состояние:ConcurrentHashMap итерация Гарантийное
«итераторы и Перечисления возвращают элементы, отражающие состояние хэш-таблицы в какой-то точке или с момента создания итератора»
Я думаю, что я гарантирован, что в приведенном ниже примере один или оба потока вызовут 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?, но хотел, чтобы подтвердить свой специфический точка, как
"в какой-то момент"
, как правило, имп что при работе с многоядерными машинами, работающими с кодом не по порядку, два потока могут одновременно обновлять разные сегменты карты, и нет никакого способа заблокировать весь ConcurrentHashMap.
Эта программа не работает. Метод 'checkForAllFinished' имеет локальную переменную' allFinished', которая является локальной. Локальные переменные всегда являются потокобезопасными, потому что они находятся в стеке и никогда не могут быть замечены другими потоками. По этой причине ваш метод 'checkForAllFinished' не будет работать так, как вы ожидаете. Если вы создадите поле экземпляра 'allFinished', оно должно быть либо синхронизировано, либо сделано' volatile', чтобы предотвратить устаревшие данные. – scottb
@scottb, что вы сказали, неверно. – Jason
Если вы ожидаете завершения набора задач, почему вы не используете 'Future'? – Jason