使用ReentrantLock和使用synchronized(object)的区别是什么?
使用ReentrantLock和synchronized(object)存在的主要区别是:
1. 使用synchronized关键字,锁的获取和释放与源代码的块结构绑定。无论如何退出块,synchronized锁都会被释放,即使是由于意外异常导致块终止。而使用显式锁定时,这种情况并不适用,所以你可以在一个方法中获取ReentrantLock(或任何其他锁),并在另一个方法中释放它。但是反过来,你必须记得在适当的时间/位置显式释放锁。如果你忘记释放锁,就会出现锁死和死锁的问题。简而言之,ReentrantLock更复杂,可能更容易出错。
2. 使用synchronized关键字获得的原始锁定与Object.wait()和Object.notify()方法配合使用。而Lock接口没有这些方法。
3. ReentrantLock可以被创建为“公平锁”,这意味着等待获取给定锁的线程将按照先进先出(FIFO)的顺序获取锁。原始锁不是公平的。
4. ReentrantLock提供了一些方法来测试锁是否正在使用,了解锁队列的长度,尝试在不阻塞的情况下获取锁,以及其他一些功能。原始锁没有这些功能。
ReentrantLock为什么被称为可重入锁?是为了允许同一线程进行递归调用吗?
可重入锁允许持有锁的线程再次获取锁。递归是其中一种可能的情况,但也有其他情况。值得注意的是,synchronized锁也是可重入的,因此不需要担心递归或其他线程可能获取已经持有的锁的情况。