java - 是否需要在不修改列表的情况下同步读取列表的方法?
问题描述
我是同步的新手。我知道当我尝试使用多线程时,我可能会遇到将东西添加到列表中的问题。例如使用以下代码:
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<>();
推荐阅读
- html - 如何在前后使用带有背景颜色的嵌入框阴影?
- orientdb - Gremlin:按活跃用户和非活跃用户的计数位置生成列表
- machine-learning - 如何使用八度音阶中的梯度下降来解决逻辑回归?
- sql - JSON值中的Oracle搜索数组?
- mpdf - 使用 mPDF 时跨度不旋转
- javascript - Parse.com 匹配给定关系列中数组上的所有指针
- c# - XDocument C#解析节点内的节点值
- security - 通过比较两个字符串的哈希值来泄漏时间是否容易受到攻击?
- php - 使用 PHP 将表格更新为 MS SQL
- c - 将 sizeof() 的结果赋值给 ssize_t