使用ReentrantLock和使用synchronized(object)的区别是什么?

10 浏览
0 Comments

使用ReentrantLock和使用synchronized(object)的区别是什么?

可能是重复的问题:

同步与锁的区别

我想知道使用ReentrantLock和Synchronized(object)是否有很大的区别?

为什么它被称为ReentrantLock?是为了允许来自同一线程的递归调用吗?

0
0 Comments

使用ReentrantLock和synchronized(object)存在的主要区别是:

1. 使用synchronized关键字,锁的获取和释放与源代码的块结构绑定。无论如何退出块,synchronized锁都会被释放,即使是由于意外异常导致块终止。而使用显式锁定时,这种情况并不适用,所以你可以在一个方法中获取ReentrantLock(或任何其他锁),并在另一个方法中释放它。但是反过来,你必须记得在适当的时间/位置显式释放锁。如果你忘记释放锁,就会出现锁死和死锁的问题。简而言之,ReentrantLock更复杂,可能更容易出错。

2. 使用synchronized关键字获得的原始锁定与Object.wait()和Object.notify()方法配合使用。而Lock接口没有这些方法。

3. ReentrantLock可以被创建为“公平锁”,这意味着等待获取给定锁的线程将按照先进先出(FIFO)的顺序获取锁。原始锁不是公平的。

4. ReentrantLock提供了一些方法来测试锁是否正在使用,了解锁队列的长度,尝试在不阻塞的情况下获取锁,以及其他一些功能。原始锁没有这些功能。

ReentrantLock为什么被称为可重入锁?是为了允许同一线程进行递归调用吗?

可重入锁允许持有锁的线程再次获取锁。递归是其中一种可能的情况,但也有其他情况。值得注意的是,synchronized锁也是可重入的,因此不需要担心递归或其他线程可能获取已经持有的锁的情况。

0