Нет, недостаточно только синхронизировать записи. Синхронизация должна применяться как для чтения, так и для записи в память.
Некоторые другие темы, где-то, когда-нибудь, должны будут прочитать карту (в противном случае, почему есть карта?), И этот поток должен быть синхронизирован для правильного просмотра памяти, представленной картой. Они также должны быть синхронизированы, чтобы избежать отключения кратковременных несоответствий в состоянии карты, поскольку оно обновляется.
Чтобы представить гипотетический пример, предположим, что Thread 1 записывает hashmap, эффекты которого хранятся в кеше 1 уровня CPU 1 только . Затем Thread 2 становится доступным для запуска через несколько секунд и возобновляется на CPU 2; он считывает хэш-карту, которая поступает из кэша уровня 1 ЦП 2 - он не видит записи, сделанные Thread 1, поскольку между записью и чтением не было операции с защитой памяти между и запись и поток чтения , Даже если Thread 1 синхронизирует записи, то, хотя эффект от записи будет сброшен в основную память, Thread 2 все равно их не увидит, потому что чтение произошло из кеша уровня 1. Таким образом, синхронизация записи только предотвращает столкновения на пишет.
Помимо кэширования процессора JMM позволяет потокам кэшировать данные в частном порядке, которые должны быть очищены только в основной памяти на барьер памяти (синхронизировать, изменчиво с некоторыми специальными ограничениями или завершить строительство неизменяемого объекта в JMM 5 +).
Чтобы полностью понять этот сложный предмет резьба вам необходимы исследования и изучение модели памяти Java, и это значение для обмена данных между потоками. Вы должны понимать концепции отношений «дожидаться» и «видимость» памяти, чтобы понять сложность совместного использования данных в современном мире многоядерных процессоров с различным уровнем кэширования процессора.
Если вы не хотите тратить время, чтобы понять JMM, простое правило, что два поток должен где-то/как-то синхронизировать на тот же объект между записью и чтением на один поток, чтобы увидеть последствия операций другого. Период. Обратите внимание, что это не означает, что все записи и чтения на объекте должны быть синхронизированы как таковые; законно создавать и настраивать объект в одном потоке, а затем «публиковать» его для других потоков, если поток публикации и выборки потоков синхронизируются на одном и том же объекте для передачи.
Я так считаю, да. Но это зависит от типа метода и от того, что вы собираетесь заблокировать. –
Хэш-запись с записью? Ты никогда не читаешь? Если да, то почему у вас даже есть это? – thejh
Пока карта не доступна никакими другими способами (например, методом доступа), тогда достаточно простой общей блокировки. – Perception