Одна вещь, которая мне не нравится в размещенном коде, это то, что в обоих фрагментах вызов
remoteclient.getslow();
вызывается, пока кеш заблокирован. Если на самом деле remoteclient.getslow (), вероятно, займет много времени для возврата (как видно из названия), то любые другие потоки, пытающиеся получить доступ к кешу, в конечном итоге будут заблокированы на долгое время (т. Е. До тех пор, пока getslow () не вернется и вызывающий поток снимает блокировку) ... даже если они заинтересованы только в несвязанных данных, которые уже присутствуют в кэше!
Чтобы избежать этого, я бы вместо этого вызывал remoteclient.getslow () вне области действия LockGuard (то есть, когда кеш разблокирован). Затем, после того, как remoteclient.getslow () вернет результат, я снова заблокирую кеш и обновлю кеш полученным значением. Таким образом, кеш никогда не блокируется на длительные периоды.
(Конечно, выполнение этого способа открывает возможность для нескольких потоков вызывать remoteclient.getslow () для одного и того же элемента данных, если они все решат, что им нужны одни и те же данные примерно в одно и то же время ... но это может быть приемлемым побочным эффектом. Или, если нет, вы можете разработать механизм для указания того, что определенное значение кэша находится в процессе извлечения, и чтобы другие потоки блокировались до тех пор, пока поиск не завершится ... если это стоит дополнительной сложности для вас. Это, вероятно, потребует условных переменных и тому подобное, чтобы сделать правильно)