Если у меня есть следующая декларация:
Map<String, Map<String, Person>> families =
Collections.synchronizedMap(new HashMap<String, Map<String, Person>>());
Если я тогда приковываю вызов так:
families.get(lastName).put(firstName, new Person());
Этот поток безопасен? Мне кажется, что только одна из двух карт синхронизирована, но вы не можете попасть на внутреннюю карту, не пройдя внешнюю синхронизированную карту, поэтому я не уверен ...
EDIT
Отличные ответы, сделанные в обоих ответах, спасибо большое! Но теперь я думаю, что если бы я сделал это:
families.put(lastName, Collections.synchronizedMap(new HashMap<String, Person>());
затем сделал мой цепной вызов, безопасна ли эта цепная нить? Возможно ли, что между get(lastName)
и put(firstName, new Person())
что другой поток может получить внутреннюю карту? Я думаю, что если я хочу, чтобы весь цепной поток был безопасным, мне нужно поместить его в синхронизированный блок, но мне также интересно, будет ли это работать также ...