繁体   English   中英

递归同步与递归重入锁定

[英]Recursive Synchronization vs Recursive Reentrant Lock

我知道允许线程获取自己拥有的监视器,即在Java中,同步锁是reentrant ,如下例所示。

我的查询是,如果我使用java.util.concurrent.locks.ReentrantLock API,它将产生相同的结果,是否可以在同步中具有死锁,而在java.util.concurrent.locks.ReentrantLock却没有

例如

  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();//
    }

如果您查看Java文档( 此处 ),重点很清楚(我的重点是):

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

要点是, 它们的行为都具有相同的概念 ,但是ReentrantLock锁提供了lock() / unlock() / etc ..等其他方法。您可以在不同的代码块(方法)中显式使用它们。

同步锁和可重入锁都是相同的。 如果您想获得更多控制权并想解决复杂的同步问题,那么Reentrant Lock是最好的选择。 它为隐式同步添加了其他功能,例如**支持条件变量,锁公平性等。**作为参考,请参见Java线程第三版-第3章及更高版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM