ReentrantLock也是一个可重入锁,定位与synchronized类似.
用法:
ReentrantLock的加锁与解锁是两个方法,lock与unlock,在使用lock加锁后需要使用unlock来解锁,推荐配合try finally使用,这样就算中间抛出异常导致线程终止,finally中的unlock也能保证正确解锁.
ReentrantLock与synchronized不同的是,提供了一个带超时时间的lock方法,trylock(超时时间)
如果获取不到锁,那么等待一段时间后放弃加锁.
ReentrantLock可以被设置为公平锁,在构造方法中传入true,就可以创建一个公平锁.
ReentrantLock搭配Condition类实现等待-唤醒,可以更精确控制唤醒某个指定的线程.
public static void main(String[] args) throws InterruptedException {
ReentrantLock lock = new ReentrantLock();
lock.lock();
try{
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
//创建公平锁
ReentrantLock lock2 = new ReentrantLock(true);
lock2.tryLock(5, TimeUnit.SECONDS);
try{
}catch (Exception e){
e.printStackTrace();
}finally {
lock2.unlock();
}
}
ReentrantLock和synchronized的区别:
1.synchronized是一个关键字,是由JVM实现的,ReentrantLock是一个标准库的类,是JVM外实现的.
2.synchronized使用时不需要手动解锁,ReentrantLock使用时需要解锁
3.synchronized在获取锁失败时,会死等,而ReentrantLock可以使用trylock来超时后放弃加锁
4.synchronized是不公平锁,而ReentrantLock可以被设置为公平锁
5.synchronized使用wait notify来进行等待唤醒,ReentrantLock搭配Condition类实现等待-唤醒,可以更精确控制唤醒某个指定的线程.
1049

被折叠的 条评论
为什么被折叠?



