Collection インスタンスへのアクセスはクラス内で同期されるべきではないことを読みました。その理由は、最初のオブジェクトと同期せずに、別のオブジェクトがリストを操作する可能性があるためと思われます。ただし、同期したいリストはプライベート フィールドであり、所有者オブジェクトによって作成され、アクセサー メソッドはありません。
プロデューサーとコンシューマーの 2 つの内部クラスを使用しています。それぞれがクラス Runnable を実装し、別のスレッドで実行されます。親クラスに属するリストにアクセスするたびに、親クラスで同期します。
さらに、私の実装では、親クラスのインスタンスを 1 つだけ使用し、各内部クラスを 1 つだけ使用しています。
では、同期ブロックを使用してアクセスを制御するだけでよいのでしょうか? それとも、これはまだノーノーですか?
SynchronizedList を使用できるとは思いません。その理由は、コンシューマ スレッドが大量に消費するためです。最初に Collections.Sort とコンパレータを使用して並べ替え、次に subList メソッドを使用して、リスト内の最初の 20 個 (デフォルト) のオブジェクトのリストを取得します (実際には新しいリストを作成します)。 、subList 呼び出しを ArrayList コンストラクターに渡すことによって)、次に subList によって返されたリストを元のリストの removeAll に渡します。
Collections.sort(pool, examComparator);
List<Candidate> squad = new ArrayList<Candidate>(pool.subList(0, squadSize));
pool.removeAll(squad);
return squad;
これは複数ステップの操作であり、アトミックである必要があるため、(私が理解しているように) add() や get( )。