1. 什么叫死锁?
� 死锁就是多个线程对自己持有的资源不释放,同时又去申请对方持有的资源,形成
循环等待。
2. 什么是乐观锁?什么是悲观锁?
� 乐观锁就是很乐观,认为别人不会修改它的数据,不会上锁,每次操作前会判断别
人有没有改过它的数据,CAS 就属于乐观锁;
� 悲观锁就是很悲观,认为别人一定会改它的数据,每次操作都会上锁,Synchronized
和 ReentrantLock 都是悲观锁。
3. 什么是自旋锁?适应性自旋锁呢
� 阻塞和唤醒线程需要系统切换 CPU 状态,这个开销是比较大的。如果一段代码的执
行时间很短,刚阻塞线程,代码就执行完了,接着又唤醒线程,这种方式效率不高,倒不如
让线程不阻塞,等代码执行完。那么就可以让线程自旋,不必阻塞,等前面线程执行完它就
可以获取资源,这就是自旋锁。实现原理就是 CAS。适应性自旋锁就是虚拟机会判断自旋
获取到锁的概率大不大,如果大,就自旋,如果不大,就阻塞线程。
4. 什么是共享锁?什么是独占锁?
� 共享锁就是可以同时被多个线程持有,一个资源被加上共享锁后,那么其他线程也
只能对其加共享锁。获得共享锁的线程只能读数据,不能写数据。ReentrantReadWriteLock
的读锁是共享锁,写锁是独占锁。
� 独占锁又叫排他锁,同一时刻只能被一个线程持有,获取到锁的线程可以对资源进
行读写操作。Synchronized 和 ReentrantLock 就是独占锁。
5. 什么是可重入锁?
� 可重入锁又叫递归锁,就是一个线程获取到锁后,就可以进入它同步着的所有代码,
即使内层函数也被锁住,也无需重新获取锁,Synchronized 和 ReentrantLock 都是可重入
锁。
6. 可重入锁的原理是什么?
� 有个 state 变量,线程获取到锁就加 1,释放锁就减 1,线程获取锁的时候会判断
state 是不是 0,是 0 就让线程获取锁,state 加 1,如果不是 0,但是当前持有锁的线程
等于当前线程,state 也会加 1。