日期:2014-05-20  浏览次数:20710 次

新手请问多线程的问题
问题一:
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