第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 @   狂热搬砖家  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
点击右上角即可分享
微信分享提示