1.线程安全的集合:集合类中,用于实现线程安全的有两种办法,一种是使用Collections.synchronizedList来替代ArrayList
具体的API如下图:
但是该类会出现并发异常:代码如下
package com.example.demo.juc;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class TestCopyOnWriteArrayList {
    public static void main(String[] args) {
        ThreadDemo threadDemo = new ThreadDemo();
        for (int i = 0; i < 10 ; i++) {
            new Thread(threadDemo).start();
        }
    }
}
class ThreadDemo implements Runnable{
    private static List<String> list = Collections.synchronizedList(new ArrayList<>());
    {
        list.add("a");
        list.add("b");
        list.add("c");
    }
    @Override
    public void run() {
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
            iterator.next();
            list.add("aa");
        }
    }
}
异常如下:
java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
    at java.util.ArrayList$Itr.next(ArrayList.java:859)
    at com.example.demo.juc.ThreadDemo.run(TestCopyOnWriteArrayList.java:30)
    at java.lang.Thread.run(Thread.java:748)
使用第二种方式的CopyOnWriteArrayList不存在该问题,写入并复制,这个每写一个就需要去复制一份,如果添加操作就很多,那就不适合使用这个,如果迭代操作多,则选择该实现
package com.example.demo.juc;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class TestCopyOnWriteArrayList {
    public static void main(String[] args) {
        ThreadDemo threadDemo = new ThreadDemo();
        for (int i = 0; i < 10 ; i++) {
            new Thread(threadDemo).start();
        }
    }
}
class ThreadDemo implements Runnable{
//    private static List<String> list = Collections.synchronizedList(new ArrayList<>());
    private static List<String> list = new CopyOnWriteArrayList<>();
    {
        list.add("a");
        list.add("b");
        list.add("c");
    }
    @Override
    public void run() {
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
            iterator.next();
            list.add("aa");
        }
    }
}
2.可以使用如下类来:
ConcurrentHashMap替代HashMap
ConcurrentSkipListMap替代TreeMap
ConcurrentSkipListSet替代TreeSet
CopyOnWriteArrayList替代ArrayList
CopyOnWriteArraySet替代HashSet
更多内容请访问:IT源点
注意:本文归作者所有,未经作者允许,不得转载