Map、List、Set分别说下线程安全类和线程不安全的类
- 其他
- 2025-07-21 19:11:55

嗨,大家好,欢迎来到程序猿漠然公众号,我是漠然。 Map、List、Set 是 Java 中非常常用的集合类,它们在多线程环境下有各自的线程安全类和线程不安全的类。本文将分别介绍这三个集合类型的线程安全类和线程不安全的类,并举例说明。 一、Map
线程安全的类:ConcurrentHashMap ConcurrentHashMap 是 Java 提供的一个线程安全的 HashMap 实现类。它内部采用分段锁技术,实现了高并发下的性能优化。ConcurrentHashMap 的主要特点如下: • 锁分段:ConcurrentHashMap 将整个哈希表分成多个段,每个段独立加锁。这样,多个线程可以同时访问不同的段,提高了并发性能。• 读写锁:ConcurrentHashMap 的读写锁可以根据操作类型自动切换,降低了锁的竞争程度。• 空键(null key)和空值(null value)处理:ConcurrentHashMap 可以存储空键和空值。2. 线程不安全的类:HashMap HashMap 是 Java 提供的一个非线程安全的 HashMap 实现类。在多线程环境下,多个线程同时访问 HashMap 可能导致数据不一致。以下是线程不安全的示例代码:
public class HashMapDemo { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("a", 1); map.put("b", 2); Thread t1 = new Thread(() -> { map.put("a", 3); }); Thread t2 = new Thread(() -> { map.put("b", 4); }); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(map.get("a")); // 输出 3 System.out.println(map.get("b")); // 输出 4 } }二、List
1. 线程安全的类:CopyOnWriteArrayList CopyOnWriteArrayList 是 Java 提供的一个线程安全的 ArrayList 实现类。它通过在写操作时创建底层数组的新副本,实现了线程安全。CopyOnWriteArrayList 的主要特点如下:
• 写入时复制:当向 CopyOnWriteArrayList 添加元素时,不直接修改当前数组,而是创建一个新的数组,将原数组的元素复制到新数组,然后引用新数组。这样,多个线程可以同时读取同一个数组,提高了并发性能。• 读取无锁:由于多个线程共享同一个数组,CopyOnWriteArrayList 在读取操作时不需要加锁。 2. 线程不安全的类:ArrayList ArrayList 是 Java 提供的一个非线程安全的 ArrayList 实现类。在多线程环境下,多个线程同时访问 ArrayList 可能导致数据不一致。以下是线程不安全的示例代码: public class ArrayListDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); Thread t1 = new Thread(() -> { list.add("c"); }); Thread t2 = new Thread(() -> { list.add("d"); }); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(list.size()); // 输出 4 } }三、Set
线程安全的类:CopyOnWriteArraySet CopyOnWriteArraySet 是 Java 提供的一个线程安全的 HashSet 实现类。它内部使用 CopyOnWriteArrayList 实现,通过在写操作时创建底层数组的新副本,实现了线程安全。 2. 线程不安全的类:HashSet HashSet 是 Java 提供的一个非线程安全的 HashSet 实现类。在多线程环境下,多个线程同时访问 HashSet 可能导致数据不一致。以下是线程不安全的示例代码: public class HashSetDemo { public static void main(String[] args) { Set<String> set = new HashSet<>(); set.add("a"); set.add("b"); Thread t1 = new Thread(() -> { set.add("c"); }); Thread t2 = new Thread(() -> { set.add("d"); }); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(set.size()); // 输出 4 } }总结 本文介绍了 Map、List、Set 三个集合类型的线程安全类和线程不安全的类,并给出了示例代码。在多线程环境下,建议使用线程安全的集合类,如 ConcurrentHashMap、CopyOnWrite
今天的分享就到这里,如果觉得对你有帮助,感谢点赞、分享、关注一波,你的认可是我创造的最大动力。
更多内容请关注公众号:程序猿漠然,一个分享有趣后端知识的公众号。
Map、List、Set分别说下线程安全类和线程不安全的类由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Map、List、Set分别说下线程安全类和线程不安全的类”