【问题标题】:java basic multithreadingjava基本多线程
【发布时间】:2015-10-15 08:00:16
【问题描述】:

为什么下面的代码不是死锁并且可以正常工作?

public class Concurrent {

    public static void main(String[] args) {
        Concurrent my = new Concurrent();
        my.method1();

    }

    private synchronized void method1() {
        System.out.println("method1");
        method2();
    }

    private synchronized void method2() {
        System.out.println("method2");
    }
}

Output:
method1
method2

当我调用 method1() 时,监视器被锁定。 JVM 或编译器不能调用 method2() 因为这个方法也被“我的”对象的监视器同步。但它工作正常。

【问题讨论】:

    标签: java multithreading synchronized


    【解决方案1】:

    为什么问题中的代码没有死锁?

    因为原始互斥体(监视器)是可重入的。当给定互斥锁内的线程尝试再次获取它时,它不会阻塞。

    JLS 17.1:

    “一个线程可能会多次锁定一个特定的监视器;每次解锁都会反转一次锁定操作的效果。”

    【讨论】:

    • 感谢您的解释,我认为如果我需要可重入锁,我应该使用 java.util.concurrent.locks.ReentrantLock。另外,我认为我的问题中的代码是死锁,但 jvm 或编译器“优化”我的代码以防止死锁。
    猜你喜欢
    • 2011-01-27
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多