このコードは、本Effective Javaからのものです
Object[] snapshot = list.toArray();// Locks list internally
私は主にここのコメントに興味があります。それはリストを作りますunmodifiable
か?リストが内部的にロックされているとはどういう意味ですか? このロックはどのくらい保持されますか? List を array に変換するより良い方法はありますか?
このコードは、本Effective Javaからのものです
Object[] snapshot = list.toArray();// Locks list internally
私は主にここのコメントに興味があります。それはリストを作りますunmodifiable
か?リストが内部的にロックされているとはどういう意味ですか? このロックはどのくらい保持されますか? List を array に変換するより良い方法はありますか?
リストが返された配列への参照を保持していないことを意味すると思います。つまり、元のリストに影響を与えずに配列を変更できるということです。同様に、リストへの変更は配列に反映されません。
これはスレッド セーフの観点から重要です。これは、別のスレッドがその間にリストの sttae を変更することを心配することなく、スレッド セーフの観点からリストの内容を反復処理できることを意味するためです。この意味で、後でリストにどのような変更が加えられても、リストの状態は返された配列で「ロック」されています。スナップショットを取得していると見なすことができます。
toArray();
リストの状態は変更されません。したがって、リストが変更不可能になることはありません。
他の人が言ったように、それは並行性に関するものだと思います:
java.uitl.List の javadoc からのテキスト
返された配列は、それへの参照がこのリストによって維持されないという点で「安全」です。(言い換えると、このリストが配列によって支えられている場合でも、このメソッドは新しい配列を割り当てる必要があります)。したがって、呼び出し元は、返された配列を自由に変更できます。
スレッドセーフについて-つまり、リストから配列への変換はスレッドセーフになります
編集:
最も簡単な方法で-あなたはそれを次のように取ることができます
Thread one
を変換しているときは、変換が完了するまで、他のスレッドはリストを変更できません。Thread one
「内部ロック」がどこで行われるのか疑問に思っている人のために:
J. Bloch は、与えられたコードの紹介として次のように書いていることに注意してくださいCollections.synchroniedList
。
その場合toArray()
、同期化されたリストの実装が (ミューテックスを使用して) まさにそれを行うため、分離された配列が作成されている間、他のスレッドによる変更が防止されるため、実際には「内部ロック」します。