重入锁ReentrantLock 可以完全替代synchronized关键字。
重要方法:
lock():获得锁,如果锁被占用,则等待。
lockInterruptibly():获得锁,但优先响应中断。
tryLock():尝试获得锁,如果成功返回true,失败返回false;该方法不等待,立即返回。
tryLock(long time,TimeUnit unit):在给定的时间内尝试获得锁。
unlock():释放锁。
构造方法: ReentrantLock(boolean fair)//为true时表示建立的锁为公平锁,实现公平锁必然要维护一个有序队列,实现成本较高,性能相对低下,默认情况下锁是不公平的。
重入锁ReentrantLock使用时要注意,加锁和释放锁必须组合使用,锁可以反复使用,例如:
ReentrantLock lock = new ReentrantLock();
lock.lock();
lock.lock();
try{
//加锁后执行的事件
}finally{
lock.unlock();
lock.unlock()
}
在重入锁的实现中,主要包含三个要素:
第一,原子状态,原子状态使用CAS操作来存储当前锁的状态,判断锁是否已经被别的线程持有。
第二,等待队列,所以没有请求到锁的线程会进入等待,队列进行等待。持有线程释放锁后,系统就能从等待队列中唤醒一个线程,继续工作。
第三,是阻塞原语park()和unpark(),用来挂起和恢复线程。没有得到锁的就会被挂起。