第5章 集合的线程安全

5.1 集合线程不安全演示

package JUC.lock;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * 演示:List集合线程不安全
 */
public class ThreadDemo4 {
    public static void main(String[] args) {
        //创建ArrayList集合
        List<String> list = new ArrayList<>();

        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();
        }
    }
}

 

 

 原因分析:查看源码,add方法没有做线程安全处理

 

 

 

 

5.2 解决方案-Vector(效率低,古老,不推荐使用)

package JUC.lock;

import java.util.*;

/**
 * 演示:List集合线程不安全
 */
public class ThreadDemo4 {
    public static void main(String[] args) {
        //创建ArrayList集合
//        List<String> list = new ArrayList<>();

        // Vector解决
        List<String> list = new Vector<>();

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

线程安全,原因分析:查看源码

 

 

 

 

 

5.3 解决方案-Collections(古老,不推荐使用)

package JUC.lock;

import java.util.*;

/**
 * 演示:List集合线程不安全
 */
public class ThreadDemo4 {
    public static void main(String[] args) {
        //创建ArrayList集合
//        List<String> list = new ArrayList<>();

        // Vector解决
//        List<String> list = new Vector<>();
        
        // Collections解决
        List<String> list = Collections.synchronizedList(new ArrayList<>());

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

线程安全,原因分析:查看源码

 

 

 

5.4 解决方案-CopyOnWriteArrayList

package JUC.lock;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 演示:List集合线程不安全
 */
public class ThreadDemo4 {
    public static void main(String[] args) {
        //创建ArrayList集合
//        List<String> list = new ArrayList<>();

        // Vector解决
//        List<String> list = new Vector<>();

        // Collections解决
//        List<String> list = Collections.synchronizedList(new ArrayList<>());

        // CopyOnWriteArrayList解决
        List<String> list = new CopyOnWriteArrayList<>();

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

线程安全,原因分析:查看源码

 

附:HashSet与HashMap线程不安全的解决方案

解决HashSet:用CopyOnWriteArraySet

解决HashMap:用ConcurrentHashMap

 

posted @ 2022-05-03 11:13  狂热搬砖家  阅读(37)  评论(0)    收藏  举报