長さ 100 の配列があります。マルチスレッド環境で使用する必要があります。配列にアクセスするスレッドは合計 10 あります。2 つのスレッドが同時に同じインデックスに書き込みを行う可能性がありますt1
。t2
Object[] data = new Object[100];
これを実装するための最良のアプローチは何ですか。
解決策 1 : 1 つのスレッドだけが配列に書き込むことができます。スレッドが異なるインデックスに書き込みたい場合でもt1
、待つ必要があります。Collections.synchronizedList(....) を使用することも、t2
使用することもできます。arrayList
public class ThreadSafeArray(){
private Object[] data = new Object[100];
public synchronized Object getValueAtIndex(int index){
return data[index]; // Removing index range check for simple explanation
}
public synchronized void setValueAtIndex(int index , Object value){
data[index] = value; // Removing index range check for simple explanation
}
}
解決策 2 : 2 つの異なるスレッドが 2 つの異なるインデックスに同時に書き込むことができます。
public class ThreadSafeArray(){
private Object[] data = new Object[100];
private Object[] lock = new Object[100];
public Object getValueAtIndex(int index){
synchronized(lock[index])
{
return data[index]; // Removing index range check for simple explanation
}
}
public void setValueAtIndex(int index , Object value){
synchronized(lock[index])
{
data[index] = value; // Removing index range check for simple explanation
}
}
}
この要件を実装するためのより良い方法はありますか?