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
。
答案 0 :(得分:1)
这是设计的。 Java monitorenter
指令放在synchronized
关键字之后的左大括号中,故意检查对象是否已被当前线程阻止,如果是,则增加阻塞计数器并让用户&# 39; s代码继续执行。
synchronized
语句的右括号表示monitorexit
指令,它递减阻塞计数器,如果它变为零,则释放监视器并允许其他线程输入synchronized
语句。 / p>
答案 1 :(得分:1)
根据定义,当两个或多个线程需要彼此的资源来完成其关键部分时,会发生死锁,因此线程会无限期地等待永不进入的资源。
在你的情况下:
如果没有两个或多个线程等待彼此关键资源,则不会出现死锁。