ConcurrentHashMap 1.8中 cas + synchronized的原理?
时间: 2023-08-20 20:13:51 浏览: 61
在 ConcurrentHashMap 1.8 中,为了提高并发性能,引入了 CAS(Compare and Swap)操作和 synchronized 关键字的结合来实现线程安全。
具体的工作原理如下:
1. ConcurrentHashMap 1.8 中使用了类似于 Java 1.5 中引入的 ReentrantLock 的 CAS 操作来进行并发控制。
2. 每个桶(Bucket)维护了一个链表或红黑树的数据结构来存储键值对。
3. 对于读操作,不需要加锁,可以并发地进行。
4. 对于写操作,首先会使用 CAS 操作尝试进行无锁更新。如果 CAS 操作成功,则直接完成操作;如果 CAS 操作失败,则会使用 synchronized 关键字加锁,确保只有一个线程可以进行写操作。
5. 在加锁的情况下,其他线程需要等待写操作完成后才能进行读或写操作。
6. 当扩容或者其他特殊情况发生时,需要获取整个 ConcurrentHashMap 的全局锁,以保证一致性。
通过使用 CAS 操作和 synchronized 关键字相结合的方式,在 ConcurrentHashMap 1.8 中实现了更高效的并发控制。CAS 操作允许多个线程同时进行读操作和无锁的写操作,减少了锁竞争的情况下的性能损失。而 synchronized 关键字则用于在 CAS 操作失败时进行有锁的写操作,保证了线程安全性。整体上提高了并发性能和吞吐量。
相关问题
在jdk1.8中cas+synchronized与segment相比的好处是什么?
在JDK 1.8中,CAS(Compare And Swap)和synchronized以及segment的好处如下:
1. CAS操作是一种无锁算法,它不需要线程上下文切换和调度的相关开销和阻塞,因此具有较高的效率和吞吐量。
2. synchronized在内部需要获得锁,如果一个线程正在使用锁,其他所有需要该锁的线程将阻塞,这会影响应用程序的性能。使用CAS可以避免锁的争用,从而提高应用程序的并发性能。
3. segment是JDK1.7之前ConcurrentHashMap的实现方式,它使用多个并发哈希表,每个哈希表对应一个Segment,每个Segment的大小都比较小,从而避免锁的争用。JDK 1.8中ConcurrentHashMap改用了CAS操作,因此不需要Segment了。
ConcurrentHashMap 1.8为什么要使用CAS+Synchronized取代Segment+ReentrantLock
ConcurrentHashMap 1.8使用CAS和Synchronized取代Segment和ReentrantLock的原因是为了提高并发性能和减少内存占用。CAS和Synchronized是Java中常用的同步机制,它们可以保证线程安全,而且相比于Segment和ReentrantLock,它们的性能更好,占用的内存更少。因此,ConcurrentHashMap 1.8采用CAS和Synchronized来实现并发控制,以提高性能和减少内存占用。