Синхронизировать доступ к HashMap из двух потоков в java

У меня есть два потока (One – основной Thread1 (Say Thread1 ), а другой – фоновый поток (скажем, Thread2 )). Я могу получить доступ к hashMap Thread1 HashMap из Thread1 и Thread2 . Thread1 изменяет hashMap и Thread2 читает HashMap.

В коде Thread1 будут:

 synchronized(hashMap){ //updating hashMap } 

В Thread2 код будет:

 synchronized(hashMap){ //reading hashMap } 

Могу ли я синхронизировать доступ к hashMap с помощью synchronized block таким образом?

Да. Но также вы можете использовать метод утилиты Collections.synchronizedMap, чтобы сделать поток hashmap безопасным:

 Map yourMap = new HashMap(); Map synchronizedMap = java.util.Collections.synchronizedMap(yourMap); 

Или вы можете использовать ConcurrentHashMap или Hashtable, которые по умолчанию являются потокобезопасными.

Я бы использовал ReadWriteLock

 ReadWriteLock rwl = new ReentrantReadWriteLock(); void read() { rwl.readLock().lock(); try { ... read } finally { rwl.readLock().unlock(); } } void write() { rwl.writeLock().lock(); try { ... write } finally { rwl.writeLock().unlock(); } } 

Вы должны попробовать использовать HashTable или ConcurrentHashMap . Оба этих класса синхронизированы, поэтому вам не придется иметь дело с этим самим. И я не думаю, что вы можете использовать synchronized ключевое слово непосредственно на конкретном объекте. Он обычно используется с .class или this , то есть с типом класса.