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

star2017 1年前 ⋅ 1549 阅读

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

具体的API如下图:
file

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

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源点

相关文章推荐

全部评论: 0

    我有话说: