私は次のように宣言している場合:私は、そうのような呼び出しをチェーンした場合チェーンされたスレッドセーフなコレクションはスレッドセーフですか?
Map<String, Map<String, Person>> families =
Collections.synchronizedMap(new HashMap<String, Map<String, Person>>());
を:
families.get(lastName).put(firstName, new Person());
このスレッドは安全ですか?私には、2つのマップのうち1つだけが同期されているように見えますが、外側の同期マップを経由せずに内側のマップにアクセスすることはできません。束!しかし、今、私は私がした場合は、この何を考えています:
families.put(lastName, Collections.synchronizedMap(new HashMap<String, Person>());
その後、は私の連鎖コールをした、チェーン全体のスレッドセーフということでしょうか? get(lastName)
とput(firstName, new Person())
の間に別のスレッドが内部マップを取得できる可能性はありますか?私はチェーン全体のスレッドを安全にしたい場合、同期されたブロックの中に置く必要があると思っていますが、これがうまくいくかどうかも疑問です。