Each map is synchronized separately, and the method calls you show are not different than handling the calls on different lines: String value = a.get("key1").get("key2"); /* is equivalant to */ Map b = a.get("key1"); String value = b.get("key2"); So getting the Map from a is thread safe in that a will not be modified while the get() occurs. Similarly getting the ...