经典面试题:Hashtable, HashMap, ConcurrentHashMap 之间的区别 对于写操作,ConcurrentHashMap 使用 CAS 操作来实现无锁的更新,这是一种乐观锁的实现,因为它假设没有冲突发生,在实际更新数据时才检查是否有其他线程在尝试修改数据,如果有,采用悲观的锁策略,如 synchronized 代码块来保证数据的一致性。Hashtable是线程安全的,Hashtable通过直接在方法中加 synchronized 来保证线程安全,太过简单粗暴,在单线程比不过HashMap,在多线程比不过ConcurrentHashMap,属于上古版本的东西,现在都不用了。
常见锁策略 1)重量级锁重量级锁多用于锁竞争激烈的情况,多在悲观锁的场景下。优点是:能够在多线程竞争激烈的情况下保证线程安全。缺点是:当一个线程获取重量级锁时,需要进行系统调用,将线程从用户态切换到内核态。这种切换会涉及到操作系统的介入,包括保存和恢复线程的上下文等操作,因此开销较大,效率比较低。2)轻量级锁轻量级锁多用于锁竞争不激烈的情况,多在乐观锁的场景下。它主要是基于 CAS(Compare - and - Swap)操作来实现的。