目录1. 锁策略1.1 悲观锁 vs 乐观锁1. 悲观锁1.2 重量级锁 vs 轻量级锁1.3 挂起等待锁 vs 自旋锁1.4 非公平锁 vs 公平锁1.5 可重入锁 vs 不可重入锁1.6 只读锁 vs 读写锁2. 关注synchronized 同步锁3.常见面试题1. 锁策略我们知道在日常工作中面对多线程并发执行遇到的线程安全问题我们最常用的解决办法就是加锁但是面对不同情况下的线程安全问题我们要选择合适的加锁策略。1.1 悲观锁 vs 乐观锁1. 悲观锁特性悲观锁乐观锁思想认为并发操作一定会产生冲突提前加锁认为并发冲突很少发生不上锁通过最终校验保证数据一致性特点独占、阻塞、排他无阻塞、无独占、失败重试执行流程加锁 → 阻塞其他线程 → 释放锁后执行读取数据 → 修改前校验版本/状态 → 一致则提交不一致重试优点数据绝对安全无并发异常并发效率高无阻塞开销缺点性能差阻塞导致高延迟频繁冲突时重试消耗资源Java实现synchronized、ReentrantLockCAS自旋如AtomicInteger、原子类✅总结多写少读用悲观锁少写多读用乐观锁1.2 重量级锁 vs 轻量级锁特性重量级锁轻量级锁实现层级内核态用户态阻塞方式线程挂起进入等待队列自旋等待不阻塞切换开销用户态 ↔ 内核态开销大无切换开销小触发场景高竞争、轻量级锁膨胀低竞争、线程交替执行典型例子synchronized最终形态CAS、偏向锁升级前的状态✅总结重量级锁在线程冲突且没有拿到锁时进行阻塞等待轻量级锁自旋占用cpu直到等到拿到锁。1.3 挂起等待锁 vs 自旋锁特性挂起等待锁阻塞锁自旋锁等待方式线程休眠阻塞进入等待队列循环空转持续尝试获取锁CPU 占用低让出 CPU不占用计算资源高持续占用 CPU 资源线程切换有线程被挂起需唤醒无线程保持运行状态响应速度较慢需唤醒线程存在调度延迟极快无需唤醒直接获取锁适用场景锁持有时间长如重量级锁锁持有时间极短如 CAS、轻量级锁优缺点优点节省 CPU缺点唤醒开销大优点无阻塞获取锁快缺点浪费 CPU 资源✅总结重量级锁 挂起等待锁轻量级锁 自旋锁1.4 非公平锁 vs 公平锁特性公平锁非公平锁规则先来先服务线程严格按请求顺序排队获取锁谁抢到谁用新线程可直接插队抢占锁新线程行为主动进入队列尾部排队不插队不排队直接尝试抢占锁优点线程执行均衡避免饥饿并发效率高减少线程唤醒开销缺点排队、唤醒严格性能略低老线程可能长期抢不到锁导致饥饿典型实现new ReentrantLock(true)synchronized、new ReentrantLock()默认✅总结业务优先性能 → 一律用非公平锁强有序排队需求 → 才用公平锁1.5 可重入锁 vs 不可重入锁特性可重入锁不可重入锁同一线程重复获取允许计数器递增阻塞死锁实现复杂度较高需维护计数器简单二元状态典型应用场景递归、嵌套调用极少数特殊场景Java实现ReentrantLock, synchronized需自定义或无直接对应实现✅总结一般开发中使用的是可重入锁因为并发效率高很少使用不可重入锁因为容易造成死锁。1.6 只读锁 vs 读写锁特性读锁共享锁写锁排他锁规则多个线程可同时加锁互不阻塞同一时刻仅一个线程持有锁特点共享、并发性高、无排他性独占、排他、阻塞其他所有读写操作限制加锁后禁止修改数据仅允许读取加锁期间禁止其他线程读写数据适用场景高频查询、数据浏览、读取操作数据新增、修改、删除等写操作✅总结①读与读不互斥②读与写互斥③写与写互斥2. 关注synchronized 同步锁属于自适应、非公平锁、可重入锁内置 JVM 自适应锁机制存在锁升级无锁→偏向锁→轻量级锁→重量级锁竞争小时自旋等待不阻塞竞争激烈转为阻塞挂起底层依托对象头 MarkWord 实现。3.常见面试题你是怎么理解悲观锁和乐观锁的具体怎么实现呢回答①悲观锁认为多个线程访问同一个共享变量时产生冲突的概率较大所以会在每次访问数据时真正地加锁。具体实现就是先加锁获取到锁之后进行访问数据如果没有获取到锁就阻塞等待。②乐观锁认为多个线程访问同一个共享变量时产生冲突的概率较小所以不会真正地加锁尝试进行数据访问的同时识别该数据是否存在访问冲突。具体实现就是不真正加锁引入版本号通过版本号识别是否存在数据访问冲突。介绍下读写锁?回答读写锁就是把读操作和写操作分别进行加锁读与读之间不互斥、读与写之间互斥、写与写之间互斥读写锁通常运用于“频繁读不频繁写”的场景中。什么是自旋锁为什么要使用自旋锁策略呢优缺点是什么回答①自旋锁是指当没有竞争到锁时不断再次尝试获取锁直到获取到锁为止。②使用自选锁的原因是当第一次获取锁失败第二次获取锁会在极短的时间内到来一旦有线程释放锁就能第一时间拿到锁③优点没有放弃cou能在锁释放的第一时间拿到锁。当持有锁时间较短时较高效。缺点当持有锁时间较长时会浪费cpu资源。synchronized 是可重入锁么回答是的。可重入锁是指连续两次加锁不会导致死锁。实现方式就是在锁中记录持有锁的线程的身份以及一个计数器当发现要加锁的线程是已经持有锁的线程计数器直接自增。以上就是关于锁策略面试应对的相关介绍感兴趣的铁铁们不妨收藏后再走叭~