递归同步与递归重入锁定

时间:2017-04-01 05:23:12

标签: java multithreading reentrantlock

我知道线程被允许获取自己拥有的监视器,即在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();//
    }

2 个答案:

答案 0 :(得分:0)

如果你看一下Java doc(here)并且非常明确(强调我的):

  

具有相同基本行为的可重入互斥锁和   语义作为使用synchronized 访问的隐式监视器锁   方法和语句,但具有扩展功能。一个   ReentrantLock由最后成功锁定的线程拥有,但是   尚未解锁。线程调用锁将成功返回   当锁不是由另一个线程拥有时获取锁。的   如果当前线程已经拥有 方法将立即返回   的

重点是它们都表现为相同的概念,但ReentrantLock锁为lock() / unlock() /等方法提供了额外的方法。您可以在不同的代码块(方法)中明确地使用它们。

答案 1 :(得分:0)

同步和重入锁都是相同的。如果您想要更多控制并希望解决复杂的同步问题,那么可重入锁是最佳选择。它为隐式同步添加了额外的功能,例如**支持条件变量,锁定公平等。** 作为参考检查Java Threads 3rd Ed - Chapter 3 and Onwards