目录
1、可重入锁sychronized的缺陷
- 很重;
- 获取时必须一直等待,没有额外的尝试机制。
优点:
synchronized是Java语言层面提供的语法,不需要考虑异常。
2、可重入锁ReentrantLock
顾名思义,ReentrantLock是可重入锁,它和synchronized一样,一个线程可以多次获取同一个锁。
ReentrantLock是Java代码实现的锁,我们就必须先获取锁,然后在finally中正确释放锁。
和synchronized不同的是,ReentrantLock可以尝试获取锁:
if (lock.tryLock(1, TimeUnit.SECONDS)) {
try {
...
} finally {
lock.unlock();
}
}
上述代码在尝试获取锁的时候,最多等待1秒。如果1秒后仍未获取到锁,tryLock()返回false,程序就可以做一些额外处理,而不是无限等待下去。
所以,使用ReentrantLock比直接使用synchronized更安全,线程在tryLock()失败的时候不会导致死锁。
计数器类使用ReentrantLock的示例
public class Counter {
private final Lock lock = new ReentrantLock();
private int count;
public void add(int n) {
lock.lock();
try {
count += n;
} finally {
lock.unlock();
}
}
}
3、小结
ReentrantLock可以替代synchronized进行同步;ReentrantLock获取锁更安全;- 必须先获取到锁,再进入
try {...}代码块,最后使用finally保证释放锁; - 可以使用
tryLock()尝试获取锁。
684

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



