4.线程不安全集合
List
public class ListTest {
public static void main(String[] args) {
/*
* 解决方案:
* 1.用Vector
* 2.List<String> list=Collections.synchronizedList(new ArrayList<>());不安全转安全
* 3.juc方案:List<String> list = new CopyOnWriteArrayList<>();
* CopyOnWrite:写入时复制,COW 计算机程序设计领域的一种优化策略
* 多个线程调用的时候,list,读取的时候,固定的,写入(覆盖)
* 在写入的时候避免覆盖,造成数据问题
* CopyOnWrite比Vector优势:Vector synchronized修饰(效率低),CopyOnWrite,复制,再set,用的juc的锁
* */
List<String> list = new ArrayList<>();
for (int i = 1; i <= 50; i++) {
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0, 5));
System.out.println(list);
}, String.valueOf(i)).start();
}
}
}
Set
//java.util.ConcurrentModificationException
public class SetTest {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
/*
* 解决:
* 1.Collections.synchronizedSet(new HashSet<>());
* 2.Set<Object> set = new CopyOnWriteArraySet<>();
* */
for (int i = 1; i <= 5000; i++) {
new Thread(() -> {
set.add(UUID.randomUUID().toString().substring(0, 5));
System.out.println(set);
}, String.valueOf(i)).start();
}
}
}
Set底层
public HashSet() {
map = new HashMap<>();
}
//add set本质就是map中的key,不可重复
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
//不变的值
private static final Object PRESENT = new Object();
Map
//java.util.ConcurrentModificationException
public class MapTest {
public static void main(String[] args) {
/*Map<String, Object> map = new HashMap<>();
* 默认值:初始化容量:16
* 加载因子:0.75f
* */
/*
* 1.使用HashTable
* 2.Map<String, Object> map=Collections.synchronizedMap(new HashMap<>());
* 3.Map<String, Object> map=new ConcurrentHashMap<>();
* */
Map<String, Object> map = new HashMap<>();
for (int i = 1; i <= 50; i++) {
new Thread(() -> {
map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0, 5));
System.out.println(map);
}, String.valueOf(i)).start();
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY