为什么没有死锁

时间:2017-08-19 13:52:41

标签: java multithreading

public class UThread implements Runnable {
    @Override
    public void run() {
        synchronized (this) {
            System.out.println("this is first");
            synchronized (this) {
                System.out.println("this is second");
            }
        }

    }
}


public class main {
    public static void main(String str[]) {
        UThread uThread = new UThread();
        Thread t = new Thread(uThread);
        t.start();
    }
}

执行代码时正在打印:

this is first
this is second

为什么没有死锁?如果代码试图锁定已经被自己占用的this

2 个答案:

答案 0 :(得分:1)

这是设计的。 Java monitorenter指令放在synchronized关键字之后的左大括号中,故意检查对象是否已被当前线程阻止,如果是,则增加阻塞计数器并让用户&# 39; s代码继续执行。 synchronized语句的右括号表示monitorexit指令,它递减阻塞计数器,如果它变为零,则释放监视器并允许其他线程输入synchronized语句。 / p>

答案 1 :(得分:1)

根据定义,当两个或多个线程需要彼此的资源来完成其关键部分时,会发生死锁,因此线程会无限期地等待永不进入的资源。

在你的情况下:

  • 只有一个线程进入关键部分
  • 关键部分只有一个资源

如果没有两个或多个线程等待彼此关键资源,则不会出现死锁。