JUC并发编程快速入门篇(三)—— 集合的线程安全

集合的线程安全

List集合线程安全问题

/*
    list集合线程安全
 */
public class ThreadDemo4 {
    public static void main(String[] args) {
        //创建ArrayList集合
//        List<String> list = new ArrayList<>(); //不安全
//        List<String> list= new Vector<>();  //效率低
//        List<String> list = Collections.synchronizedList(new ArrayList<>()); //不推荐使用
        List<String> list = new CopyOnWriteArrayList<>(); //推荐使用(重点)
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                //向集合中添加内容
                list.add(UUID.randomUUID().toString().substring(0,8));
                //从集合中获取内容
                System.out.println(list);
            },String.valueOf(i)).start();
        }
    }
}

Set集合线程安全问题

public class ThreadHashSet {
    public static void main(String[] args) {
//        Set<String> set = new HashSet<>();    //线程不安全
        Set<String> set = new CopyOnWriteArraySet<>(); //线程安全
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                //向集合中添加内容
                set.add(UUID.randomUUID().toString().substring(0, 8));
                //从集合中获取内容
                System.out.println(set);
            },String.valueOf(i)).start();
        }
    }
}

Map集合线程安全问题

public class ThreadMap {
    public static void main(String[] args) {
//        Map<String, String> map = new HashMap<>();  //线程不安全
        Map<String, String> map = new ConcurrentHashMap();  //线程安全

        for (int i = 0; i < 10; i++) {
            String key = String.valueOf(i);
            new Thread(() -> {
                //向集合中添加内容
                map.put(key, UUID.randomUUID().toString().substring(0, 8));
                //从集合中获取内容
                System.out.println(map);
            }, String.valueOf(i)).start();
        }
    }
}

总结

1.线程安全与线程不安全集合

集合类型中存在线程安全与线程不安全的两种,常见例如:

ArrayList ----- Vector

HashMap -----HashTable

但是以上都是通过 synchronized 关键字实现,效率较低

2.Collections 构建的线程安全集合

3.java.util.concurrent 并发包下

CopyOnWriteArrayList CopyOnWriteArraySet 类型,通过动态数组与线程安全个方面保证线程安全

上一篇:JUC并发编程—— 各种锁的理解


下一篇:JUC核心控件AQS源码解析第三部分(共享锁、CountDownLatch和CyclicBarrier)