LINUX.ORG.RU

История изменений

Исправление 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));
  }
}

и все