Если у меня есть следующее заявление:Являются ли цепные поточные безопасные коллекции потоками безопасными?
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())
другой поток может получить внутреннюю карту? Я думаю, что если я хочу, чтобы целая цепочка была безопасной, мне нужно поместить ее внутри синхронизированного блока, но мне также интересно, будет ли это также работать ...