第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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器