ReentrantLock
可重入锁
可中断
可以设置超时时间
可以让线程在超时后放弃获取锁
可以设置公平锁
可以实现公平锁或非公平锁
支持多个条件变量
让线程在某些条件下进入等待
和synchronized一样都支持重入
//创建锁对象
ReentrantLock Lock = new ReentrantLock();
try{
//获取锁
lock.lock();
}finally{
//释放锁
//在finally中释放保证不会死锁
lock.unlock();
}
ReentrantLock底层原理
CAS+AQS
有两个构造方法,无参代表非公平锁,传入参数true代表公平锁
先用CAS尝试修改state进行加锁,如果成功加锁修改为1
如果没有成功加锁则进入队列
释放锁时机制同AQS
公平锁:唤醒head线程持有锁
非公平锁:唤醒head线程和队列外线程争抢
exclusiveOwnerThread:锁的持有者