Почему HashMap.get(key) необходимо синхронизировать при синхронизации операций изменения? ⇐ JAVA
-
Гость
Почему HashMap.get(key) необходимо синхронизировать при синхронизации операций изменения?
Я использую операции .get(...), .put(...) и .clear() из нескольких потоки на одном HashMap. .put(...) и .clear() находятся внутри блока synchronized, но .get(...)< /код> нет. Я не могу себе представить, что это вызовет проблемы, но в другом коде, который я видел, .get() почти всегда синхронизируется.
соответствующий код для получения/вставки
Значение объекта = map.get(key); если (значение == ноль) { синхронизировано (карта) { значение = map.get(ключ); // проверяем еще раз, возможно, между ними были изменения если (значение == ноль) { map.put(ключ, новое значение(...)); } } } и ясно просто:
синхронизировано (карта) { карта.очистить(); } Операции записи сделают кеши недействительными из-за синхронизации, а get(...) возвращает либо ноль, либо экземпляр. Я не могу понять, что может пойти не так или что можно улучшить, поместив операцию .get(...) в блок synchronized(map).
Я использую операции .get(...), .put(...) и .clear() из нескольких потоки на одном HashMap. .put(...) и .clear() находятся внутри блока synchronized, но .get(...)< /код> нет. Я не могу себе представить, что это вызовет проблемы, но в другом коде, который я видел, .get() почти всегда синхронизируется.
соответствующий код для получения/вставки
Значение объекта = map.get(key); если (значение == ноль) { синхронизировано (карта) { значение = map.get(ключ); // проверяем еще раз, возможно, между ними были изменения если (значение == ноль) { map.put(ключ, новое значение(...)); } } } и ясно просто:
синхронизировано (карта) { карта.очистить(); } Операции записи сделают кеши недействительными из-за синхронизации, а get(...) возвращает либо ноль, либо экземпляр. Я не могу понять, что может пойти не так или что можно улучшить, поместив операцию .get(...) в блок synchronized(map).
Мобильная версия