我有一个长度为 100 的数组。我需要在多线程环境中使用它。共有 10 个线程访问数组。可能有两个线程想要一次写入同一个索引t1
。t2
Object[] data = new Object[100];
实现这一点的最佳方法是什么。
解决方案 1:只有一个线程可以写入数组。即使t1
和t2
线程想要写入不同的索引,也必须等待。甚至我们可以使用arrayList
并且可以使用 Collections.synchronizedList(....)。
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:两个不同的线程可以同时在两个不同的索引上写入。
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
}
}
}
有没有更好的方法来实现这个要求?