首页 > 解决方案 > 是否需要在不修改列表的情况下同步读取列表的方法?

问题描述

我是同步的新手。我知道当我尝试使用多线程时,我可能会遇到将东西添加到列表中的问题。例如使用以下代码:

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的任何值是否有效?nm

标签: javamultithreading

解决方案


如果您想要一个同步列表,请使用synchronizedList

List<Double> mySafeList = Collections.synchronizedList(new ArrayList<>());

请注意,迭代不同步。


或者,如果您想要不同步的读取访问,代价是写入速度较慢,请使用CopyOnWriteArrayList

List<Double> mySafeList = new CopyOnWriteArrayList<>();

推荐阅读