java - Java 的可重入锁和死锁

标签 java locking deadlock reentrancy

有人可以用 Java 代码(伪)示例向我解释一下 Reentrant lockdeadlock 是如何相互关联的吗?

最佳答案

可重入锁定机制允许持有锁的线程重新进入临界区。这意味着您可以执行以下操作:

public synchronized void functionOne() {

    // do something

    functionTwo();

    // do something else

    // redundant, but permitted...
    synchronized(this) {
        // do more stuff
    }    
}

public synchronized void functionTwo() {
     // do even more stuff!
}

在不可重入锁中,当您尝试从 functionOne() 调用 functionTwo() 时会出现死锁情况,因为线程必须等待锁……它自己持有。

死锁当然是线程1持有锁A等待锁B,线程2持有锁B等待锁A的恶性情况,两者都无法继续。此代码示例会造成死锁:

public synchronized void deadlock() throws InterruptedException {
    Thread th = new Thread() {
        public void run() {
            deadlock();
        }
    }.start();

    th.join();
}

调用线程试图等待生成的线程,而该线程在调用者退出之前不能调用 deadlock()。咔嚓!

关于java - Java 的可重入锁和死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6470888/

相关文章:

java - 未知 SAXException : Requested schema is not found in local repository

java - 集群中的spring boot应用程序

mongodb - mongodb写锁行为

java - 这段java代码是如何产生死锁的?

ios - 有什么方法可以在生产环境中使用数据集调试应用程序?

sql - 在 MySQL 中获取死锁

java - RCP:JxBrowser 许可证检查失败:未找到有效许可证

java - 使用正则表达式分析Java中的字符串

c - 解锁时向多个线程发出信号的一把锁

hibernate - 如何在 JPA 实体管理器中锁定整个实体(表)