死锁发生在: 线程1锁定了res1,而线程2锁定了res2, 这
时, 线程1不能获得 res2, 线程2不能获得 res1, 谁都不能获得所需的res可以把线程2改为: 先获得res1, 后锁定res2 ,这样就不会死锁

解决方案 »

  1.   

    t1锁了s1 sleep, 这时t2运行锁了s2 sleep
    然后t1醒了找s2,s2在t2上,t1挂起,
    t2醒了找s1,s1在t1上,两个都得不到第二层的锁 当然就死锁了
      

  2.   

    当线程1进入同步res1时
    线程2刚好进入同步res2
    双发都在等待对方释放锁的对峙情况
      

  3.   

    谢谢楼上几位,还是有点不明白
    线程1锁定res1,线程2锁定res2,然后各自sleep,1秒后分别醒来,这时各自需要的资源都应该没有线程锁定才对啊?
    我的理解错在哪里
      

  4.   

    锁的意思是:
    会在锁定处等待该资源被释放,代码是不会继续执行的。
    而且sleep时,不会释放资源。上述线程1锁定res1范围是if语句段,即只有执行完if才会释放res1。
        线程2锁定res2范围是else语句段,只有执行完else才会释放res2。但在if中,接着又要使用res2,此时res2已被同步,即被锁住,代码等待res2的释放。
    同理,发生在else中。造成死锁。
      

  5.   

    线程1锁定res1,线程2锁定res2,然后各自sleep,1秒后分别醒来,但是如下你的程序所示的,当线程1醒来的时候它并没有释放掉锁定的res1,看synchronized(res1) 这个块的作用范围内还在锁定中
    synchronized(res1) ...{
                    System.out.println("Resource 1 is locked. Waiting for Resource 2.");
                    try ...{
                        Thread.sleep(1000);
                    }
                    catch (InterruptedException e) ...{}
                    /**//* 锁定资源res2 */
                    synchronized(res2) ...{
                        System.out.println("Complete.");
                    }
                }