面试题答案
一键面试数据结构变化
- JDK 1.7:采用Segment数组 + HashEntry数组实现。Segment继承自ReentrantLock,每个Segment内部包含一个HashEntry数组。这种结构类似“分段锁”,不同Segment间的数据操作可并发执行。
- JDK 1.8:借鉴了HashMap的数据结构,采用数组 + 链表/红黑树。当链表长度大于阈值(8)且数组长度大于64时,链表会转化为红黑树,以提升查找性能。
锁机制变化
- JDK 1.7:使用Segment的独占锁(ReentrantLock),对每个Segment加锁,使得同一时间只有一个线程能访问该Segment内的数据,不同Segment间操作可并发。
- JDK 1.8:摒弃了Segment分段锁机制,采用Node数组 + CAS + synchronized实现。在更新操作时,对链表或红黑树的头节点使用synchronized关键字加锁,锁粒度更细,相比于JDK 1.7的Segment锁,能有更多线程并发访问。
对性能的影响
- JDK 1.7:由于Segment的存在,虽然不同Segment间可并发,但每个Segment的锁粒度较大,同一时间只有一个线程能访问Segment内数据,在高并发场景下,锁竞争可能较为激烈,影响性能。
- JDK 1.8:锁粒度细化,降低了锁竞争的可能性,在高并发场景下能支持更多线程同时访问,性能有显著提升。例如在插入操作中,JDK 1.8不需要像JDK 1.7那样对整个Segment加锁,而是对单个Node加锁,使得并发插入效率更高。
对线程安全的影响
- JDK 1.7:通过Segment的独占锁保证线程安全,不同Segment间操作互不干扰,能有效防止数据竞争。
- JDK 1.8:虽然锁机制改变,但通过CAS操作和synchronized关键字同样能保证线程安全。例如在更新操作时,先使用CAS尝试更新数据,如果失败则使用synchronized加锁进行操作,确保数据一致性。