一、ReentrantLock和synchronized的区别
相对于 synchronized 它具备如下特点:
可中断
可以设置超时时间
可以设置为公平锁
支持多个条件变量
与 synchronized 一样,都支持可重入
使用方法
reentrantLock.lock();
try {
// 临界区
} finally {
// 释放锁
reentrantLock.unlock();
}
二、可重入
可重入是指同一个线程如果首次获得了这把锁,那么因为它是这把锁的拥有者,因此有权利再次获取这把锁;如果是不可重入锁,那么第二次获得锁时,自己也会被锁挡住。
public class Kechongru {
static Lock lock=new ReentrantLock();
public static void main(String[] args) {
// TODO Auto-generated method stub
Kechongru k=new Kechongru();
k.method1();
}
void method1()
{
lock.lock();
try
{
System.out.println("method1");
method2();
}
finally
{
lock.unlock();
}
}
void method2()
{
lock.lock();
try
{
System.out.println("method2");
method3();
}
finally
{
lock.unlock();
}
}
void method3()
{
lock.lock();
try
{
System.out.println("method3");
}
finally
{
lock.unlock();
}
}
}
method1
method2
method3
确实可重入。
三、可中断。
可中断指的是如果一个线程竞争锁失败后被阻塞,另一个线程可以调用打断方法,将这个线程终止,避免长时间等待。
四、锁超时
主要是trylock方法。线程通过tryLock方法尝试获得锁,失败后立刻return。
或者调用tryLock(time)方法,在某个时间内一直尝试获得锁,到了时间还没有得到,立刻return。
五、公平锁
所谓非公平锁,指的是多个线程竞争锁失败后,进入阻塞队列,如果锁被释放了,立刻一拥而上,无所谓先后,争抢锁。
公平锁讲究先来后到。
Lock lock=new ReentrantLock(true);//定义公平锁。
六、条件变量
synchronized 中也有条件变量,就是我们讲原理时那个 waitSet 休息室,当条件不满足时进入 waitSet 等待。
ReentrantLock 的条件变量比 synchronized 强大之处在于,它是支持多个条件变量的,这就好比synchronized 是那些不满足条件的线程都在一间休息室等消息。
而 ReentrantLock 支持多间休息室,有专门等烟的休息室、专门等早餐的休息室、唤醒时也是按休息室来唤醒。