ConcurrentHashMap采用cas+sync是1.7还是1.8
时间: 2023-06-16 12:04:06 浏览: 114
ConcurrentHashMap在JDK1.7和1.8中都采用了CAS(Compare And Swap)和synchronized锁来实现线程安全。在1.7中,ConcurrentHashMap采用了分段锁(Segment),将数据分成若干段,每一段加锁,这样不同的线程可以同时访问不同的段,提高了并发性能。在1.8中,ConcurrentHashMap不再采用分段锁,而是采用了更加高效的CAS算法和synchronized锁来实现线程安全。同时,在1.8中,ConcurrentHashMap增加了一些新的方法和功能,例如支持函数式编程、支持并发更新和查询等。
相关问题
ConcurrentHashMap采用cas+sync
是的,ConcurrentHashMap采用了CAS(Compare and Swap)和synchronized来保证并发安全。具体来说,ConcurrentHashMap内部采用了一个分段锁(Segment),每个Segment内部都是一个HashEntry数组,每个HashEntry是一个键值对。在put、get等操作时,首先会根据key的hash值确定它所在的Segment,然后对该Segment进行加锁(使用synchronized),然后在这个Segment中进行操作,因此不同的Segment之间可以并行处理,从而提高了并发性能。而在操作具体的HashEntry时,采用了CAS机制,避免了使用重量级锁,从而进一步提高了并发性能。
ConcurrentHashMap 是如何实现的? 1.7、1.8 实现有何不同?为什么这么做?
ConcurrentHashMap 是 Java 中的一个线程安全的哈希表实现,它支持高并发的读写操作。在 Java 1.7 中,ConcurrentHashMap 的实现是基于分段锁的,即将整个哈希表分成若干个小段,每个小段都有一个独立的锁,这样多个线程可以同时访问不同的小段,从而提高并发性能。而在 Java 1.8 中,ConcurrentHashMap 的实现则变成了基于 CAS(Compare and Swap)操作的无锁算法。
Java 1.8 中基于 CAS 的实现相比于分段锁有以下优点:
1. 基于 CAS 的实现不需要加锁,避免了锁竞争所带来的性能开销。
2. 基于 CAS 的实现可以实现更细粒度的同步控制,因为每个哈希桶都可以独立进行操作。
3. 基于 CAS 的实现可以更好地支持并发扩容,因为在扩容时只需要对新增的哈希桶进行 CAS 操作即可,而不需要进行锁竞争。
基于 CAS 的实现也带来了一些新的问题,例如在高并发情况下可能会出现多个线程同时对同一个哈希桶进行 CAS 操作的情况,从而导致一些线程的操作失败,需要重新尝试。为了解决这个问题,Java 1.8 中的 ConcurrentHashMap 引入了一种新的技术叫做红黑树,在哈希桶中存储的链表长度达到一定阈值时,将链表转换成红黑树,从而提高查找效率。
阅读全文