1.线程安全的集合:集合类中,用于实现线程安全的有两种办法,一种是使用Collections.synchronizedList来替代ArrayList

具体的API如下图:



线程安全的HashMap,TreeMap,ArrayList,TreeSet,Set_java


但是该类会出现并发异常:代码如下

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