线程安全集合类

线程安全集合类概述

线程安全集合类可以分为三大类:

  1. 遗留的线程安全集合如 Hashtable , Vector
  2. 使用 Collections 装饰的线程安全集合,如:

Collections.synchronizedCollection

Collections.synchronizedList

Collections.synchronizedMap

Collections.synchronizedSet

Collections.synchronizedNavigableMap

Collections.synchronizedNavigableSet

Collections.synchronizedSortedMap

Collections.synchronizedSortedSet

  1. java.util.concurrent.*

重点介绍 java.util.concurrent.* 下的线程安全集合类,可以发现它们有规律,里面包含三类关键词:

Blocking、CopyOnWrite、Concurrent

  • Blocking 大部分实现基于锁,并提供用来阻塞的方法
  • CopyOnWrite 之类容器修改开销相对较重
  • Concurrent 类型的容器
  1. 内部很多操作使用 cas 优化,一般可以提供较高吞吐量
  2. 弱一致性

遍历时弱一致性,例如,当利用迭代器遍历时,如果容器发生修改,迭代器仍然可以继续进行遍历,这时内容是旧的

求大小弱一致性,size 操作未必是 100% 准确

读取弱一致性

注意:遍历时如果发生了修改,对于非安全容器来讲,使用 fail-fast 机制也就是让遍历立刻失败,抛出

ConcurrentModifificationException,不再继续遍历

ConcurrentHashMap类

主要特点

ConcurrentHashMap是Java集合框架中的一个类,它是一个线程安全的哈希表,可以在高并发的情况下进行读写操作,适合于多线程环境下的高效并发访问。

ConcurrentHashMap的主要特点如下:

  1. 线程安全性:ConcurrentHashMap是线程安全的,可以在多线程环境下并发访问,不需要像HashTable类那样使用同步方法或者加锁来保证线程安全。
  2. 分段锁设计:ConcurrentHashMap内部使用Segment数组来分段锁定。每个Segment就是一个独立的哈希表,拥有自己的锁。这样,在多线程的情况下,每个线程只需要锁住自己所需要访问的Segment,可以有效地提高并发访问性能。
  3. 高效性能:ConcurrentHashMap在多线程并发访问时,能够支持较高的吞吐量,而且可以通过控制Segment的数量,来平衡空间和时间的开销。当需要扩容的时候,只需要扩容其中的一个 Segment,而不需要对整个HashMap进行扩容。
  4. 支持高并发读写:ConcurrentHashMap支持高并发读写,可以在读写操作上分别使用不同的锁。这样,在读操作时,只需要获取读锁,其他读操作可以并行进行。在写操作时,需要获取写锁,此时不允许读和写操作同时进行。
  5. 数据一致性:ConcurrentHashMap虽然是线程安全的,但是在多线程的情况下,可能会存在一些数据不一致的情况。例如,两个线程同时对同一个键进行更新操作,这时候只有一个线程的更新操作会生效,而另一个线程的更新操作将会被忽略。所以,在使用ConcurrentHashMap类时,需要根据具体的需求来确定是否需要保证数据的一致性。

总的来说,ConcurrentHashMap是一个高效、线程安全、支持高并发访问的哈希表,适合于多线程环境下的高效并发访问。

主要方法

ConcurrentHashMap是Java中一个线程安全的哈希表实现,它支持高并发性能和线程安全,而这是通过使用分段锁的方式实现的。下面是ConcurrentHashMap类方法的总结:

  1. put(Object key, Object value)方法:将键值对存储到ConcurrentHashMap中,如果已存在则更新value值。
  2. putIfAbsent(Object key, Object value)方法:只有当key不存在时才将键值对存储到ConcurrentHashMap中,否则不做任何操作。
  3. remove(Object key)方法:从ConcurrentHashMap中移除指定的key-value,如果key不存在则不做任何操作。
  4. replace(Object key, Object oldValue, Object newValue)方法:如果键为key的键值对存在,且value等于oldValue,则将value更新为newValue。
  5. replace(Object key, Object value)方法:如果键为key的键值对存在,则将value更新为新的value。
  6. size()方法:返回ConcurrentHashMap中键值对的数量。
  7. clear()方法:清空ConcurrentHashMap中所有的键值对。
  8. containsKey(Object key)方法:如果ConcurrentHashMap中包含键为key的键值对,则返回true。
  9. containsValue(Object value)方法:如果ConcurrentHashMap中包含指定value的键值对,则返回true。
  10. get(Object key)方法:返回与指定键相关联的值。
  11. keySet()方法:返回ConcurrentHashMap中所有键的集合。
  12. values()方法:返回ConcurrentHashMap中所有值的集合。
  13. entrySet()方法:返回ConcurrentHashMap中所有键值对的集合。

总之,ConcurrentHashMap类提供了一系列线程安全的方法,支持高并发的读取和写入操作。它很适合在需要高并发读写操作,而且需要线程安全的场景下使用。

源码分析

https://www.nowcoder.com/discuss/460771795130466304?sourceSSR=search

https://developer.aliyun.com/article/342013

https://www.cnblogs.com/williamjie/p/9099861.html

https://www.nowcoder.com/discuss/409396995431940096?sourceSSR=search

八股笔记

https://blog.csdn.net/weixin_44936189/article/details/117091687


线程安全集合类
http://example.com/2023/03/26/线程安全集合类/
作者
程序员小魏
发布于
2023年3月26日
许可协议