Set、List、Map线程安全问题

本文介绍了如何在Java中创建线程安全的集合类,包括List、Set和Map。通过使用Collections.synchronized方法或者ThreadLocal封装的方式实现。具体示例包括synchronizedList、synchronizedSet及synchronizedMap等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. List,Map,Set 线程安全性
这里写图片描述
2. 声明线程安全的集合方法
– 使用Collections. 方式构建

 //make thread-safe list
  List MyStrList = Collections.synchronizedList(new ArrayList());
  MyStrList.add("123");
  MyStrList.add("abc");
  //make thread-safe hashset
  Set set=Collections.synchronizedSet(new HashSet());
  set.add(123);
  set.add(456);
  //make thread-safe hashmap
  Map map=Collections.synchronizedMap(new HashMap());
  map.put(1, "thb");
  map.put(12, "bill tang");

– 使用ThreadLocal封装

参考文献
[1] List,Map,Set 线程安全性 - - ITeye博客
[2] java 中如何声明线程安全的集合 set, map 和 list大树叶新浪博客

### Java 中 ListSetMap线程安全实现 #### 1. 线程安全的 `List` 实现 对于 `List` 接口,存在多种方式来确保其线程安全性: - **Vector 类** 这是一个古老的同步列表实现。每一个方法都被标记为 `synchronized`,从而保证了任何时刻只有一个线程可以修改向量的内容。 ```java Vector<String> vector = new Vector<>(); ``` - **Collections.synchronizedList 方法** 使用此静态工厂方法可将任意 `List` 转换成线程安全版本。需要注意的是,返回的对象仅在其内部操作上提供同步保护;如果要迭代访问,则需手动获取锁。 ```java List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>()); ``` - **CopyOnWriteArrayList 类** 此类特别适合读多写少的应用场景。它的工作原理是在执行写入时复制整个底层数组,而不是锁定单个元素或整个结构。这使得读取操作无需等待写入完成即可继续进行[^3]。 ```java List<Integer> cowal = new CopyOnWriteArrayList<>(); ``` #### 2. 线程安全的 `Set` 实现 针对 `Set` 集合同样有几种不同的方案可供选择: - **ConcurrentSkipListSet 类** 提供了一个高度并发化的有序集合视图。该类基于跳跃表(skip-list),允许高效的查找、插入和删除操作。 ```java Set<Integer> concurrentSkipListSet = new ConcurrentSkipListSet<>(); ``` - **Collections.newSetFromMap 工厂方法** 利用给定映射创建一个新的不可重复元素集合作为键值对存储。当传入参数为 `ConcurrentHashMap` 时,可以获得良好的并发特性。 ```java Set<Object> threadSafeSet = Collections.newSetFromMap( new ConcurrentHashMap<>() ); ``` - **CopyOnWriteArraySet 类** 它实际上就是封装了一层 `CopyOnWriteArrayList` 来作为底层容器,继承自抽象基类 AbstractSet 并实现了 Set 接口。适用于高频率读取低频度更新的情况[^5]。 ```java Set<String> cowas = new CopyOnWriteArraySet<>(); ``` #### 3. 线程安全的 `Map` 实现 最后来看一下如何处理 `Map` 数据结构的安全性问题: - **Hashtable 类** 可视为早期版的哈希表实现,类似于今天的 `HashMap`,只不过前者提供了全面的方法级同步控制。不过由于历史原因以及一些设计上的局限性,通常建议优先考虑更现代的选择。 ```java Hashtable<Integer, String> hashtable = new Hashtable<>(); ``` - **ConcurrentHashMap 类** 自 JDK 1.5 引入以来便成为最常用的高性能并发散列映射之一。相比于传统的加锁策略,采用了分段锁技术大大提高了吞吐量。从JDK 1.8 开始进一步优化为了CAS算法配合链表转红黑树的方式提升性能。 ```java ConcurrentHashMap<Long, Long> chm = new ConcurrentHashMap<>(); ``` - **SynchronizedMap 封装器** 同样来自工具包中的辅助函数,能够快速地把普通地图转换成具备基本互斥特性的实例。然而实际应用中往往不如直接选用专门构建好的组件那样高效稳定。 ```java Map<K,V> syncMap = Collections.synchronizedMap(new HashMap<>()); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值