concurrenthashmap 1.7与1.8
时间: 2023-09-19 20:09:53 浏览: 99
ConcurrentHashMap是Java中的一个线程安全的哈希表实现。在Java 1.7版本中,ConcurrentHashMap的实现使用了分段锁(Segment)的方式来保证线程安全。具体地说,ConcurrentHashMap被分成了若干个Segment,每个Segment上有一个锁,不同的线程可以同时访问不同的Segment,从而实现了并发访问的效果。
在Java 1.8版本中,ConcurrentHashMap的实现方式发生了变化。它不再使用分段锁,而是采用了一种称为“CAS+Synchronized”的方式来保证线程安全。具体地说,ConcurrentHashMap中的每个桶(Bucket)都被设计为一个链表或红黑树,每个桶上都有一个锁。当多个线程同时访问同一个桶时,它们会先尝试使用CAS(Compare And Swap)方式更新桶中的元素。如果CAS操作失败,它们会使用Synchronized方式来获取桶上的锁,然后再进行操作。
总的来说,ConcurrentHashMap在1.8版本中的性能和并发度都有所提高,但是1.7版本中的分段锁实现方式也有它的优点,比如更适合多写少读的场景。所以在选择使用ConcurrentHashMap时,需要根据具体的场景来进行选择。
相关问题
concurrenthashmap1.7和1.8
`ConcurrentHashMap`是Java集合框架中的一种线程安全的哈希表实现,它允许高效地同时读取和写入数据。从Java 1.7版本开始,`ConcurrentHashMap`作为`java.util.concurrent`包的一部分得到了增强。
**Java 1.7 版本 ConcurrentHashMap**:
- 使用了分段锁(Segmented Locking),将大表划分为多个较小的部分,并对每个部分独立加锁,这提高了并发性能,尤其是在大量线程操作时。
- 支持`weak keys`和`soft values`,即弱引用键和软引用值,当内存不足时会自动清理不再强关联的对象。
- 当缓存容量达到阈值时,默认采用“温和”的扩容策略,而不是立即扩大容量,减少了扩容带来的性能影响。
**Java 1.8 版本 ConcurrentHashMap**:
- 在保持原有特性的同时,进一步优化了内部数据结构,如引入了`ReentrantLock`代替之前的` synchronize()`,锁粒度更细,可以减少死锁风险。
- 引入了`eviction`算法(默认是 `Local搬移`),当缓存满时,会尝试迁移部分数据到其他分段,而不是直接拒绝插入新元素。
- 对于`putIfAbsent()`等条件写入操作,增加了无锁支持,提升了并发性能。
- 保留了`weak keys`和`soft values`功能。
concurrenthashmap1.7 1.8区别
在ConcurrentHashMap的1.7版本和1.8版本之间存在一些区别。其中最主要的区别是在内部数据结构上。在1.7版本中,ConcurrentHashMap使用了Segment数组来实现并发控制,每个Segment都继承了ReentrantLock类,表示一个锁。而每个Segment中又有一个table数组,其中的索引对应着一个Node链表。这种设计在1.7版本中是为了实现更细粒度的锁控制,提高并发性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [ConcurrentHashMap的介绍以及1.7和1.8版本的区别](https://blog.csdn.net/qq_38658642/article/details/112399319)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
阅读全文