线程安全集合类概述
线程安全集合类可以分为三大类:
- 遗留的线程安全集合如 Hashtable , Vector
- 使用 Collections 装饰的线程安全集合,如:
Collections.synchronizedCollection
Collections.synchronizedList
Collections.synchronizedMap
Collections.synchronizedSet
Collections.synchronizedNavigableMap
Collections.synchronizedNavigableSet
Collections.synchronizedSortedMap
Collections.synchronizedSortedSet
- java.util.concurrent.*
重点介绍 java.util.concurrent.* 下的线程安全集合类,可以发现它们有规律,里面包含三类关键词:
Blocking、CopyOnWrite、Concurrent
- Blocking 大部分实现基于锁,并提供用来阻塞的方法
- CopyOnWrite 之类容器修改开销相对较重
- Concurrent 类型的容器
- 内部很多操作使用 cas 优化,一般可以提供较高吞吐量
- 弱一致性
- 遍历时弱一致性,例如,当利用迭代器遍历时,如果容器发生修改,迭代器仍然可以继续进行遍历,这时内容是旧的
- 求大小弱一致性,size 操作未必是 100% 准确
- 读取弱一致性
注意:遍历时如果发生了修改,对于非安全容器来讲,使用 fail-fast 机制也就是让遍历立刻失败,抛出
ConcurrentModifificationException,不再继续遍历
ConcurrentHashMap类
主要特点
ConcurrentHashMap是Java集合框架中的一个类,它是一个线程安全的哈希表,可以在高并发的情况下进行读写操作,适合于多线程环境下的高效并发访问。
ConcurrentHashMap的主要特点如下:
- 线程安全性:ConcurrentHashMap是线程安全的,可以在多线程环境下并发访问,不需要像HashTable类那样使用同步方法或者加锁来保证线程安全。
- 分段锁设计:ConcurrentHashMap内部使用Segment数组来分段锁定。每个Segment就是一个独立的哈希表,拥有自己的锁。这样,在多线程的情况下,每个线程只需要锁住自己所需要访问的Segment,可以有效地提高并发访问性能。
- 高效性能:ConcurrentHashMap在多线程并发访问时,能够支持较高的吞吐量,而且可以通过控制Segment的数量,来平衡空间和时间的开销。当需要扩容的时候,只需要扩容其中的一个 Segment,而不需要对整个HashMap进行扩容。
- 支持高并发读写:ConcurrentHashMap支持高并发读写,可以在读写操作上分别使用不同的锁。这样,在读操作时,只需要获取读锁,其他读操作可以并行进行。在写操作时,需要获取写锁,此时不允许读和写操作同时进行。
- 数据一致性:ConcurrentHashMap虽然是线程安全的,但是在多线程的情况下,可能会存在一些数据不一致的情况。例如,两个线程同时对同一个键进行更新操作,这时候只有一个线程的更新操作会生效,而另一个线程的更新操作将会被忽略。所以,在使用ConcurrentHashMap类时,需要根据具体的需求来确定是否需要保证数据的一致性。
总的来说,ConcurrentHashMap是一个高效、线程安全、支持高并发访问的哈希表,适合于多线程环境下的高效并发访问。
主要方法
ConcurrentHashMap是Java中一个线程安全的哈希表实现,它支持高并发性能和线程安全,而这是通过使用分段锁的方式实现的。下面是ConcurrentHashMap类方法的总结:
- put(Object key, Object value)方法:将键值对存储到ConcurrentHashMap中,如果已存在则更新value值。
- putIfAbsent(Object key, Object value)方法:只有当key不存在时才将键值对存储到ConcurrentHashMap中,否则不做任何操作。
- remove(Object key)方法:从ConcurrentHashMap中移除指定的key-value,如果key不存在则不做任何操作。
- replace(Object key, Object oldValue, Object newValue)方法:如果键为key的键值对存在,且value等于oldValue,则将value更新为newValue。
- replace(Object key, Object value)方法:如果键为key的键值对存在,则将value更新为新的value。
- size()方法:返回ConcurrentHashMap中键值对的数量。
- clear()方法:清空ConcurrentHashMap中所有的键值对。
- containsKey(Object key)方法:如果ConcurrentHashMap中包含键为key的键值对,则返回true。
- containsValue(Object value)方法:如果ConcurrentHashMap中包含指定value的键值对,则返回true。
- get(Object key)方法:返回与指定键相关联的值。
- keySet()方法:返回ConcurrentHashMap中所有键的集合。
- values()方法:返回ConcurrentHashMap中所有值的集合。
- 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