Да, изменения, внесенные в карту, будут видны обоим потокам.
Java действительно использует передачу по значению - но значение в этом случае является ссылкой (аналогично указателю).Значение переменной ссылочного типа в Java - всегда ссылка на объект или ноль.Это никогда не сам объект.
Так что ваш код не создаст новую карту.Существует очень мало операций, которые неявно создают новый объект.Я могу думать только об использовании строковых литералов (где литералы интернированы в любом случае) и автобоксе примитивных типов.Кроме этого, вы получите новый объект только через оператор new
.(Очевидно, что любой метод, который вы вызываете, мог бы создать новый объект тоже ...)
Обратите внимание, что это совершенно отдельно от вопроса синхронизации между потоками.Бизнес по копированию объектов против копирования ссылок ортогонален многопоточности.В этом случае похоже, что вы решили многопоточность, используя Collections.synchronizedMap
;как говорит Пангея, вы можете вместо этого использовать ConcurrentHashMap
, который не будет использовать почти столько же блокировок (если есть).Другая реализация интерфейса ConcurrentMap
- это ConcurrentSkipListMap
.Посмотрите документы для обоих классов, чтобы решить, что подходит вам лучше всего.