请引用下面的代码
package com.test;
public class DeadLock {
private void method1() {
synchronized (Integer.class) {
method2();
}
}
private void method2() {
synchronized (Integer.class) {
System.out.println("hi there");
}
}
public static void main(String[] args) {
new DeadLock().method1();
}
}
据我了解,在任何情况下都不应该执行
method2
中的代码,因为method1
拥有Integer.class
的锁定,而method2
试图再次访问Integer.class
的锁定。但是令我惊讶的是,该代码运行良好,并且在控制台上显示了“hi there”。有人可以澄清吗? 最佳答案
锁归线程所有。如果您的线程已经拥有一个锁,则Java假定您不需要第二次获取它,而只需继续。
如果在按住锁的同时在method1()
中启动第二个线程,并且第二个线程执行method2()
方法,则会出现死锁。
如果您喜欢代码,那么synchronized
的工作方式如下:
Lock lock = Integer.class.getLock();
boolean acquired = false;
try {
if(lock.owner != Thread.currentThread()) {
lock.acquire();
acquired = true;
}
...code inside of synchronized block...
} finally {
if(acquired) lock.release();
}
这是演示死锁的代码。只需将
runInThread
设置为true
:package com.test;
public class DeadLock {
private void method1() {
synchronized (Integer.class) {
boolean runInThread = false;
if( runInThread ) {
Thread t = new Thread() {
@Override
public void run() {
method2();
}
};
t.start();
try {
t.join(); // this never returns
} catch( InterruptedException e ) {
e.printStackTrace();
}
} else {
method2();
}
}
}
private void method2() {
System.out.println("trying to lock");
synchronized (Integer.class) {
System.out.println("hi there");
}
}
public static void main(String[] args) {
new DeadLock().method1();
}
}