Этот код очень правильный. Это также очень неэффективно, поскольку вы создаете несколько блокировок для добавления нового объекта в другой поток. Таким образом, вы эффективно подводите танк к проблеме, которая намного проще.
TL; DR таков:
map = Collections.synchronizedMap(map);
Ваш код можно было бы написать так, и он был бы больше эффективный:
public class ConcurrentHashMap<K, V> {
private static final EasyThread thread = EasyThread.start("concurrentHashMap_Thread");
private final Map<K, V> map = new HashMap<>();
public synchronized V put(K key, V value) {
return map.put(key, value);
}
public synchronized V get(K key) {
return map.get(key);
}
public synchronized V remove(K key) {
return map.remove(key);
}
}
Но вам, очевидно, это не нужно, поскольку у нас есть метод synchronizedMap
...
Так почему бы нам не ConcurrentHashMap
?
Потому что мы не работаем на огромных серверах. См. Эту статью: https://crunchify.com/hashmap-vs-concurrenthashmap-vs-synchronizedmap-how-a-hashmap-can-be-synchronized-in-java/
TL; DR этой статьи состоит в том, что ConcurrentHashMap
имеет смысл, когда у вас много потоков и много ядер сервера. Он пытается go лишнюю милю при ограничении синхронизации для максимального масштаба. Для мобильных устройств это большой перебор.