CurrentHashMap学习笔记_未完

由于HashMap并不是线程安全的,所以不能并发操作它。多线程编程推荐使用CurrentHashMap。

jdk 1.7 采用分段锁技术,整个 Hash 表被分成多个段,给每一个段加个segment锁,而不是把每一个元素加锁,这样做有什么好处坏处?段与段之间可以并发访问,这在一定程度上提高了运行效率,但是却牺牲了部分线程安全性。所有的 put,get,remove 等方法都是根据键的 hash 值对应到相应的段中,然后尝试获取锁进行访问。可以理解为segment数组中的每一个segment中都包含一个和HashMap类似的数据结构。

CurrentHashMap学习笔记_未完

jdk 1.8 取消了基于 Segment 的分段锁思想,改用 CAS + synchronized 控制并发操作,在某些方面提升了性能。并且追随 1.8 版本的 HashMap 底层实现,使用数组+链表+红黑树进行数据存储。

CurrentHashMap学习笔记_未完

与HashMap中Node的区别

  1. val与next用volatile修饰,保证了可见性。
  2. 不支持setValue。
  3. find()方法用于map中的get()方法,在子类中被覆盖