我知道线程被允许获取自己拥有的监视器,即在Java中,同步锁是reentrant
,如下例所示。
我的查询是,如果我使用java.util.concurrent.locks.ReentrantLock
API它会产生相同的结果,我们可以在同步中使用死锁,但绝不会在java.util.concurrent.locks.ReentrantLock
e.g。
final Object[] objects = new Object[10]
public synchronized Object setAndReturnPrevious(int index, Object val) {
lock.lock();//If i use this will it be same as above synchronization
set(index, val);
lock.unlock()//;
}
public synchronized void set(int index, Object val) {
lock.lock();//
objects[index] = val;
lock.unlock();//
}
答案 0 :(得分:0)
如果你看一下Java doc(here)并且非常明确(强调我的):
具有相同基本行为的可重入互斥锁和 语义作为使用synchronized 访问的隐式监视器锁 方法和语句,但具有扩展功能。一个 ReentrantLock由最后成功锁定的线程拥有,但是 尚未解锁。线程调用锁将成功返回 当锁不是由另一个线程拥有时获取锁。的的强> 如果当前线程已经拥有 ,方法将立即返回 的锁强>
重点是它们都表现为相同的概念,但ReentrantLock
锁为lock()
/ unlock()
/等方法提供了额外的方法。您可以在不同的代码块(方法)中明确地使用它们。
答案 1 :(得分:0)
同步和重入锁都是相同的。如果您想要更多控制并希望解决复杂的同步问题,那么可重入锁是最佳选择。它为隐式同步添加了额外的功能,例如**支持条件变量,锁定公平等。** 作为参考检查Java Threads 3rd Ed - Chapter 3 and Onwards