Юзаю 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()).