我是同步新手。我知道当我尝试使用多线程时,将内容添加到列表中可能会遇到问题。例如使用以下代码:
import java.util.ArrayList;
class MySafeList extends ArrayList<Double>{
static ArrayList<Double> mySafeList;
public boolean add(Double d){
mySafeList.add(d);
return true;
}
public int size(){
return mySafeList.size();
}
public Double get(int i){
return mySafeList.get(i);
}
static boolean stressTest(int n, int m){
Thread threads[] = new Thread[n];
try{
for(int i=0; i<n; i++){
threads[i] = new Thread(new ThreadTest(1));
threads[i].start();
for(int j=0; j<m;j++){
Double d = new Double((double) j);
mySafeList.add(d);
}
}
return true;
}catch(Exception e){
return false;
}
}
public static void main(String[] args) {
MySafeList safeList = new MySafeList();
stressTest(2,4);
}
}
我想在add ()
方法中添加同步原语,是否需要同步读取列表而不修改列表的方法(size ()
和get ()
)?如果需要,如何同步这些原语,并验证 MySafeList
对于 n
和 m
的任何值都有效?
最佳答案
如果您想要同步列表,请使用 synchronizedList
:
List<Double> mySafeList = Collections.synchronizedList(new ArrayList<>());
请注意,迭代不同步。
或者,如果您想要不同步的读取访问,但代价是写入速度较慢,请使用 CopyOnWriteArrayList
:
List<Double> mySafeList = new CopyOnWriteArrayList<>();
关于java - 是否有必要同步读取列表而不修改列表的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55840034/