本帖最后由 falcon4585 于 2010-07-22 10:30:21 编辑

解决方案 »

  1.   

    这里synchronized 关键字是获得对象锁
    首先A.foo(B)调用的时候就获得了A的锁 在方法返回前不会释放
    然后B.foo(A)调用的是有会获得B的锁 在返回前也不会释放过了sleep之后 A会调用B.last()方法 由于也是synchronized方法 所以需要获得B的锁
    B调用A.last()方法也是这样。相当于A和B都拥有自己的锁不释放,又要获得对方的锁,就造成死锁了
      

  2.   

    1、“每个对象都拥有自己的隐式管程,当对象的同步方法被调用时管程自动载入。”
    可以理解为这个对象的锁 2、一旦一个线程包含在一个同步方法中,没有其他线程可以调用相同对象的同步方法。
    由于获得的是对象锁 所以同一时间只能有一个线程访问带synchronized关键字的方法3、“在给定的时间,仅有一个线程可以获得管程。”(既然每个对象都拥有自己的隐式管程为什么
    不能在同一时间每个线程都进入自己的管程?)
    你所说的“自己的隐式管程”一个对象只有一个,所有的线程都使用它4、“一个拥有管程的线程如果愿意的话可以再次进入相同的管程。( ”拥有管程不就是在管程里面吗,
    再次进入怎么理解?)
    同一线程可以递归获得锁。
      

  3.   

    不知道这么理解对不对:
    锁是针对对象的,不是针对方法(我知道这么说不准确)。一个对象中只要有一个synchronized修饰的方法被调用,该对象就会被加锁,再调用该对像里的任何其它synchronized方法都不可以(必须等锁被释放),但调用该对象里的非synchronized方法则不受限制。
    我原以为synchronized是“锁”方法的,只有访问synchronized方法内部才会受限制,某对象处于syn..方法外的部分可以随意访问。
      

  4.   

    你理解的没错 
    有时间可以看看<<java thread>>这本书