62,620
社区成员
发帖
与我相关
我的任务
分享something sleepy!
woke up!
something else
这个结果说明不了任何问题,我帮你分析一下为什么产生这个结果
你这个程序有2个线程,main线程和 new Thread线程
你首先执行的是new Thread线程的t.doSomething();方法
这个方法首先获得子对象的锁,再获得父对象的锁,在父对象方法中打印something sleepy
然后睡1秒,在睡觉过程中,他持有2个锁,子对象的锁和父对象的锁
此时调度器选中main线程,main线程调用t.doSomethingElse();
执行此方法需要子对象的锁,但很遗憾,子对象的锁目前仍然在new Thread手里,所以main线程阻塞
然后new Thread睡醒了,打印woke up!
然后释放父对象的锁
然后释放子对象的锁
然后main线程不在阻塞,执行t.doSomethingElse();方法,打印something elsepublic class Test {
public static void main(String[] args) throws InterruptedException {
final TestChild t = new TestChild();
new Thread(new Runnable() {
@Override
public void run() {
t.doSomething();
}
}).start();
Thread.sleep(100);
t.doSomethingElse();
}
public synchronized void doSomething() {
System.out.println("something sleepy!");
try {
Thread.sleep(1000);
System.out.println("woke up!");
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
private static class TestChild extends Test {
public void doSomething() {
super.doSomething();
}
public synchronized void doSomethingElse() {
System.out.println("something else");
}
}
}