线程安全的HashMap,TreeMap,ArrayList,TreeSet,Set
原创
©著作权归作者所有:来自51CTO博客作者DeBuggggggg的原创作品,请联系作者获取转载授权,否则将追究法律责任
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