问题一:
new Thread(this).start(); 启动这个线程后,是不是没有立即执行,而是执行了下面的 a.foo(b);
问题二:
当进程运行至a.foo(b)后,为什么还能跳出来到另外一个进程?方法是synchronized,为什么可以跳出?
以上是根据运行结果提出的疑问:
- Java code
class A{ synchronized void foo(B b) { String name=Thread.currentThread().getName(); System.out.println(name + " entered A.foo()"); try{Thread.sleep(1000);} catch(Exception e){System.out.println(e.toString());} System.out.println(name + " trying to call B.last()"); b.last(); } synchronized void last() { System.out.println("inside A.last"); }}class B{ synchronized void bar(A a) { String name=Thread.currentThread().getName(); System.out.println(name + " entered B.bar()"); try{Thread.sleep(1000);} catch(Exception e){System.out.println(e.toString());} System.out.println(name +" trying to call A.last()"); a.last(); } synchronized void last() { System.out.println("inside B.last"); }}class Deadlock implements Runnable{ A a=new A(); B b=new B(); Deadlock() { Thread.currentThread().setName("MainThread"); new Thread(this).start(); a.foo(b); System.out.println("back in Mian Thread"); } public void run() { Thread.currentThread().setName("RacingThread"); b.bar(a); System.out.println("back in Other Thread"); } public static void main(String[] args) { System.out.println(""); new Deadlock(); } }
------解决方案--------------------------------------------------------
synchronized要锁相同一个对象才行
在非静态方法用synchronized相当于锁this
你这两个方法synchronized锁得是不同的this