Если у меня есть несинхронизированная коллекция Java в многопоточной среде, и я не хочу заставлять читателей коллекции синхронизироваться[1] возможно ли решение, в котором я синхронизирую писатели и использую атомарность присваивания ссылок? Что-то вроде:
private Collection global = new HashSet(); // start threading after this
void allUpdatesGoThroughHere(Object exampleOperand) {
// My hypothesis is that this prevents operations in the block being re-ordered
synchronized(global) {
Collection copy = new HashSet(global);
copy.remove(exampleOperand);
// Given my hypothesis, we should have a fully constructed object here. So a
// reader will either get the old or the new Collection, but never an
// inconsistent one.
global = copy;
}
}
// Do multithreaded reads here. All reads are done through a reference copy like:
// Collection copy = global;
// for (Object elm: copy) {...
// so the global reference being updated half way through should have no impact
Создание собственного решения, похоже, часто терпит неудачу в таких ситуациях, поэтому мне было бы интересно узнать о других шаблонах, коллекциях или библиотеках, которые я мог бы использовать для предотвращения создания и блокировки объектов для моих потребителей данных.
[1] Причинами являются большая доля времени, затрачиваемого на чтение по сравнению с записью, в сочетании с риском возникновения взаимоблокировок.
Изменить :Много полезной информации в нескольких ответах и комментариях, некоторые важные моменты: