ReentrantLock和synchronized都可以用于线程同步,它们有什么区别?

synchronized (lockObj) {
    ...
}

vs

lock.lock();
try {
    ...
} finally {
    lock.unlock();
}
ReentrantLocksynchronizedthreadlock
2
214
小课
小课2022-05-28 16:06
1 个回答

使用ReentrantLock获取锁和释放锁可以不在同一个地方,而synchronized无论是方法还是代码块都只能是在一个方法中获一个代码块中,比如

1private ReentrantLock lock;
2
3public void foo() {
4  ...
5  lock.lock();
6  ...
7}
8
9public void bar() {
10  ...
11  lock.unlock();
12  ...
13}

ReentrantLock提供的接口更加丰富,它支持tryLock()tryLock(long, TimeUnit)来尝试获取锁,以及lockInterruptibly()可中断获取锁,还可以指定获取锁的策略,公平锁或非公平锁。ReentrantLock可以获取当前锁的信息,比如当前占有锁的线程以及等待锁的线程队列等。这些都是使用synchronized无法实现的。ReentrantLock的用法可以参考ReentrantLock使用介绍

但是synchronized的优势也很明显,就是使用非常简单,只需要一个关键字修饰即可实现一个线程安全的方法或者代码块。

2
已修改
小课
小课2022-05-28 16:27
你的回答

内容