JUC中锁的底层使用的就是AQS
-
ReentrantLock:Lock接口的实现类,可重入锁。相当于synchronized同步锁。
-
ReentrantReadWriteLock:ReadWriteLock接口的实现类。类中包含两个静态内部类,ReadLock读锁、WriteLock写锁。
-
Condition:是一个接口,都是通过lock.newCondition()实例化。属于wait和notify的替代品。提供了await()、signal()、singnalAll()与之对应。
-
LockSupport:和Thread中suspend()和resume()相似。
1. synchronized和lock的区别(面试题)
1.类型不同
synchronized是关键字。修饰方法,修饰代码块
Lock是接口
2.加锁和解锁机制不同
synchronized是自动加锁和解锁,程序员不需要控制。
Lock必须由程序员控制加锁和解锁过程,解锁时,需要注意出现异常不会自动解锁
3.异常机制
synchronized碰到没有处理的异常,会自动解锁,不会出现死锁。
Lock碰到异常不会自动解锁,可能出现死锁。所以写Lock锁时都是把解锁放入到finally{}中。
4.Lock功能更强大
Lock里面提供了tryLock()/isLocked()方法,进行判断是否上锁成功。synchronized因为是关键字,所以无法判断。
5.Lock性能更优
如果多线程竞争锁特别激烈时,Lock的性能更优。如果竞争不激烈,性能相差不大。
6.线程通信方式不同
synchronized 使用wait()和notify()线程通信。
Lock使用Condition的await()和signal()通信。
7.暂停和恢复方式不同
synchronized 使用suspend()和resume()暂停和恢复,这俩方法过时了。
Lock使用LockSupport中park()和unpark()暂停和恢复,这俩方法没有过时。
ReadWriteLock: ReadLock 读锁,又称为共享锁。允许多个线程同时获取该读锁 WriteLock 写锁,又称为独占锁。只有一个线程能获取,其他写的线程等待,避免死锁
LockSupport是Lock中实现线程暂停和线程恢复。suspend()和resume()是synchronized中的暂停和恢复。 * 暂停恢复不会释放锁,避免死锁问题