У меня есть Java HashMap, который обычно читается и изменяется одним потоком. Когда поток записывает данные в эту карту через put, у меня есть следующий фрагмент кода, который проверяет некоторые предварительные условия:
Код: Выделить всё
void put(Set toAdd, long id) {
/// ....
toAdd.forEach(stuff -> {
long prevId = map.getOrDefault(stuff, NO_EXIST)
Preconditions.checkState(prevId < id);
})
/// Update map here
toAdd.forEach(stuff -> {
map.put(stuff, id);
})
/// ...
}
Несмотря на то, что это обычный HashMap, мне было интересно, безопасно ли здесь использовать параллельный поток, чтобы ускорить процесс:
Код: Выделить всё
void put(Set toAdd, long id) {
/// ....
toAdd.parallelStream().forEach(stuff -> {
long prevId = map.getOrDefault(stuff, NO_EXIST)
Preconditions.checkState(prevId < id);
})
/// Update map here
toAdd.forEach(stuff -> {
map.put(stuff, id);
})
/// ...
}
В предыдущих сообщениях я читал, что несколько одновременных операций чтения не должны быть проблемой, и в этом случае карта доступна только вызывающему (одиночному) потоку для внесения изменений, и это будет не произойдет до тех пор, пока не будут проверены предварительные условия. Аналогично, если этот поток захочет выполнить еще один put, никакой другой поток не будет выполнять никаких операций на этой карте. Следовательно, за пределами этого параллельного потока (который содержит только операции чтения) параллельных операций не существует. Есть ли какие-либо последствия для корректности или потенциальные проблемы с видимостью при этом?
Похожий вопрос: безопасность потоков Java hashmap только для чтения
Подробнее здесь:
https://stackoverflow.com/questions/735 ... llelstream