スレッドセーフなコレクション(リストまたはセット)を同期したいと思っています。私のコレクションには、名前、値などのfiledsを持つVariableクラスのオブジェクトが含まれます。今度は、2つのスレッドがそのリストからオブジェクトを変更したい(新しいものを追加するか、既存のものを削除する)とします。それを行うには最高の解決策は何ですか?私はstackoverflowでこのようなsmthを見つけました。同期された変数のコレクション
List<Variable> varList = Collections.synchronizedList(new ArrayList<Variable>());
void processList(List<Variable> varList, String name)
{
synchronized(varList) {
varList.stream().filter(o -> o.getName().equals(name)).findFirst().ifPresent(o -> o.setValue(100));
// or
varList.remove(0);
// or
varList.add(new Variable());
}
}
問題なく動作しますか?または、より良い解決策がありますか?
スレッドがリスト内の 'Variable'オブジェクトを変更する場合、' Variable'クラスはリストではなくスレッドセーフでなければなりません。 –
それは動作します、リストはスレッドセーフになります。 –
Variable.classが変更可能な場合、このオブジェクトには、別の「競合状態」につながる状態を共有しています。 –