Юзаю findbugs для анализа написанного. Есть singleton, использование которого аналогично кэшу с небольшой предварительной обработкой, читают его все, а пишет в него poller раз в час. Поскольку читать его могут сразу несколько объектов, ставить synchronized на него как-то странно, получится узкое место (не самое крупное, но все-таки). С другой стороны, синхронизация с сеттером все-таки нужна.
сейчас сделал через ReentrantLock(), получилось так (обработку исключений, доп скобки и прочее убрал чтоб глаза не мозолить)
getter() {
  if (setterLock.isLocked())
    waittime = isSet.awaitNanos(...);
  if (waittime <= 0)
    return Collection.emptyMap();
  return instance;
}
setter(...) {
  setterLock.lock();
  try {
    ...
    if (setterLock.hasWaiters(isSet))
      isSet.signalAll();
  } finally {
    setterLock.unlock();
  }
}
findbugs ругается что мол некошерно юзать isLocked(). но другого варианта как проверить лок без собственно его захвата я что-то не нашел (tryLock() его закрывает, и надо кстати на него в сеттере поменять lock()).






