java - 是否有必要同步读取列表而不修改列表的方法?

标签 java multithreading

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

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 的任何值都有效?

最佳答案

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

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

请注意,迭代不同步。


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

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

关于java - 是否有必要同步读取列表而不修改列表的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55840034/

相关文章:

java - Collectors.toMap() 中的错误报告是否已损坏?

java - 是否可以暂时禁用 Hibernate 实体的级联?

c# - 是否必须提供与C#中的多线程相关的事件的场景?

multithreading - Clojure 多线程输出流

c# - 用定时器替换代码而不是线程 sleep

java - 如果迭代已经同步,是否有必要使用synchronizedList而不是List?

java - 如何获得模型中所有单独的三角形?

java - Android:seekbar.setProgress() 给出 Nullpointer 异常

java - "spring.data.web.pageable.one-indexed-parameters=true"不起作用

c++ - Pthreads 和结构 C++