История изменений
Исправление Deleted, (текущая версия) :
если у тебя состояние коллекции меняется - то лок не поможет, нужна коллекция которая поддерживает многопоточность
если не меняется, то у тебя вся задача - получить/установить ссылку, для этого достаточно обычного синхронайза - т.к. когда ничего нет тебе все равно «ждать», а когда есть - блокировка при записи ставится только на время обновления ссылки - это копейки.
get() {
Map localRef;
synchronized(lock) {
localRef = this.ref;
}
return localRef == null? Collections.emptyMap() : localRef;
}
set(Map newRef) {
// если таки надо что-то делать то делаем это вне синхронайз блока
// исключение - когда нежелательно делать это конкуррентно, но это отдельная история (и тут уже имеет смысл ReadWriteLock)
synchronized(lock) {
// вообще в guava есть ImmutableMap... но тут делаем ее руками
this.ref = Collections.unmodifiableMap(new HashMap(newRef));
}
}
и все
Исправление Deleted, :
если у тебя состояние коллекции меняется - то лок не поможет, нужна коллекция которая поддерживает многопоточность
если не меняется, то у тебя вся задача - получить/установить ссылку, для этого достаточно обычного синхронайза - т.к. когда ничего нет тебе все равно «ждать», а когда есть - блокировка при записи ставится только на время обновления ссылки - это копейки.
get() {
Map localRef;
synchronized(lock) {
localRef = this.ref;
}
return localRef == null? Colelctions.emptyMap() : localRef;
}
set(Map newRef) {
// если таки надо что-то делать то делаем это вне синхронайз блока
// исключение - когда нежелательно делать это кокуррентно, но это отдельная история
synchronized(lock) {
// вообще в guava есть ImmutableMap... но тут делаем ее руками
this.ref = Collections.unmodifiableMap(new HashMap(newRef));
}
}
и все
Исходная версия Deleted, :
если у тебя состояние коллекции меняется - то лок не может, нужна коллекция которая поддерживает многопоточность
если не меняется, то у тебя вся задача - получить/установить ссылку, для этого достаточно обычного синхронайза - т.к. когда ничего нет тебе все равно «ждать», а когда есть - блокировка при записи ставится только на время обновления ссылки - это копейки.
get() {
Map localRef;
synchronized(lock) {
localRef = this.ref;
}
return localRef == null? Colelctions.emptyMap() : localRef;
}
set(Map newRef) {
// если таки надо что-то делать то делаем это вне синхронайз блока
// исключение - когда нежелательно делать это кокуррентно, но это отдельная история
synchronized(lock) {
// вообще в guava есть ImmutableMap... но тут делаем ее руками
this.ref = Collections.unmodifiableMap(new HashMap(newRef));
}
}
и все