主题
面试速答(先看这里)
**一句话结论:**如果只提Java内置的锁的话,那么主要就是 synchronized 和 ReentrantLock 这两种锁。
60秒标准回答:
这个问题可太大了,因为所有的锁都可以回答。因为我们可以根据不同的分类方式进行介绍
如果只提Java内置的锁的话,那么主要就是 synchronized 和 ReentrantLock 这两种锁
通过 synchronized 和 ReentrantLock 的相同点和不同点来说的话,可以有这么几种锁的定义
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**这个问题可太大了,因为所有的锁都可以回答。
- **要点2:**通过 synchronized 和 ReentrantLock 的相同点和不同点来说的话,可以有这么几种锁的定义。
**记忆锚点:**synchronized → ReentrantLock → StampedLock → Java → 可重入锁 → 自旋锁
关键取舍:
- synchronized 、 ReentrantLock 都是悲观锁,CAS是乐观锁 读写锁 VS StampedLock: StampedLock支持 悲观读锁、写锁,还支持 乐观读,比 ReadWriteLock 性能更好。
易错提醒:
- 自旋锁: 线程不会立即阻塞,而是通过循环等待锁释放,避免线程切换开销。
加分表达:
- 如果只提Java内置的锁的话,那么主要就是 synchronized 和 ReentrantLock 这两种锁。
追问准备:
- 围绕「synchronized」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「ReentrantLock」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「StampedLock」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
这个问题可太大了,因为所有的锁都可以回答。因为我们可以根据不同的分类方式进行介绍。
如果只提Java内置的锁的话,那么主要就是**synchronized** 和**ReentrantLock**这两种锁。
📄 ✅synchronized和reentrantLock区别?
打开文档:✅synchronized和reentrantLock区别?
通过**synchronized** 和**ReentrantLock**的相同点和不同点来说的话,可以有这么几种锁的定义。
**阻塞锁&非阻塞锁:**拿不到锁时线程挂起,直到被唤醒,比如
synchronized、ReentrantLock都是阻塞锁。可重入锁VS不可重入锁:
可重入锁:一个线程可以多次获取同一把锁(计数器+1,释放时-1),比如
synchronized、ReentrantLock。公平锁VS非公平锁:
synchronized和ReentrantLock默认都是非公平锁。
- 偏向锁、轻量级锁、重量级锁:涉及到
synchronized的锁膨胀的过程。
- 乐观锁VS悲观锁:这是代码中比较常用的用来做并发防控的,一般在数据库层面出现的比较多。
synchronized、ReentrantLock都是悲观锁,CAS是乐观锁
- **读写锁 VS StampedLock:**StampedLock支持 悲观读锁、写锁,还支持 乐观读,比
ReadWriteLock性能更好。 - **自旋锁:**线程不会立即阻塞,而是通过循环等待锁释放,避免线程切换开销。JVM 在
synchronized的轻量级锁中用到。
- 分布式锁VS 单机锁:
- 数据库锁
- 无锁:如volatile、不可变模式、ThreadLocal等。(为啥要提这个,因为他也是一种解决并发问题的方案)
- 活锁 VS 死锁