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

    }
}
posted @   jpy  阅读(7)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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
点击右上角即可分享
微信分享提示