java_集合不安全

1、ArrayList

复制代码
/**
 * 集合类不安全问题
 * 1、故障现象:
 *      java.util.ConcurrentModificationException(并发修改异常)
 * 2、解决方案
 *      3.1、new Vector<>();
 *      3.2、Collections.synchronizedList(new ArrayList<>());
 *      3.3、new CopyOnWriteArrayList<>();//写时复制
 */
public class ContainerNotSafeDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            new Thread(() ->{
                list.add(UUID.randomUUID().toString().substring(0,8));
                System.out.println(list);
            },String.valueOf(i)).start();
        }
    }
}
复制代码

 

ArrayList之线程不安全解决方式1:使用线程安全的集合,例如Vector、Stack

List<String> list = new Vector<>();

ArrayList之线程不安全解决方式2:

使用Collections类

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

ArrayList之线程不安全解决方式3:

写时拷贝技术

List<String> list = new CopyOnWriteArrayList<>();

 

2、HashSet

复制代码
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        for (int i = 1; i <= 30; i++) {
            new Thread(() ->{
                set.add(UUID.randomUUID().toString().substring(0,8));
                System.out.println(set);
            },String.valueOf(i)).start();
        }
    }
复制代码

HashSet之线程不安全解决方式1:

Set<String> set = Collections.synchronizedSet(new HashSet<>());

HashSet之线程不安全解决方式2:

Set<String> set = new CopyOnWriteArraySet<>();

 

3、HashMap

复制代码
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        for (int i = 1; i <= 30; i++) {
            new Thread(() ->{
                map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,8));
                System.out.println(map);
            },String.valueOf(i)).start();
        }
    }
复制代码

HashMap之线程不安全解决方式1:使用线程安全的集合,例如Hashtable

HashMap之线程不安全解决方式2:

Map<String,String> map = Collections.synchronizedMap(new HashMap<>());

HashMap之线程不安全解决方式3:

Map<String,String> map = new ConcurrentHashMap<>();

 

posted @   DHaiLin  阅读(87)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示