【发布时间】:2013-08-02 15:34:59
【问题描述】:
我有一个长度为 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
}
}
}
有没有更好的方法来实现这个要求?
【问题讨论】:
-
在 JAVA 中使用
Vector或CopyOnWriteArrayList会更好 -
你这样做是为了锻炼还是在重新发明轮子。这个问题也更适合codereview.stackexchange.com
-
@NarendraPathai 练习
-
@NarendraPathai 与解决方案 2 相比,CopyOnWriteArrayList 将是一个很好的解决方案。
-
“可能有两个线程 t1 和 t2 想同时写入同一个索引。” - 好的,那么谁应该是赢家?您需要额外的业务逻辑。
标签: java arrays multithreading thread-safety