ReentrantLock重入锁功能具有与使用synchronized的方法和语句访问的隐式监视器锁相同的基本行为和语义,但具有扩展能力。
Synchronized加锁,在程序异常后jvm会自动释放锁;但ReentrantLock的锁需要我们自己释放。
所以为了确保锁被释放,ReentrantLock必须在finally块中释放锁
Lock lock = new ReentrantLock();
lock.lock();
try {
// update object state
}
finally {
lock.unlock();
}
ReentrantLock加锁,可以设置超时,可被中断;Synchronized加锁时,获取不到锁会一直等待,无法中断。
void lock();
如果获取了锁立即返回,如果锁被占用,一直处于休眠状态,直到获取锁。
void lockInterruptibly() throws InterruptedException;
如果获取了锁立即返回,如果锁被占用,一直处于休眠状态,直到获取锁或者被中断。
boolean tryLock();
如果获取了锁,立即返回true,如果锁被占用,立即返回false。
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
如果获取了锁,立即返回true,若果锁被占用,等待time时间,如果等待期间获取了锁,返回true,如果超时还未获得锁,返回false,并且等待期间可被中断。
ReentrantLock锁的原理是CAS操作
CAS比较并交换。
ReentrantLock有公平锁和非公平锁两种模式,默认构造函数是非公平锁。
公平锁保证先请求锁的线程先获得锁;非公平锁不保证先到先得,可能后到的线程比先请求的先得到执行。









网友评论