test1 先锁goods,再锁money
test2 先锁money,再锁goods现在同时两个线程在运行,第一个线程假设就是test1,第二个线程假设就是test2
test1 运行时,先锁定goods,然后在未放锁的情况下请求money
test2 运行时,先锁定money,然后在未放锁的情况下请求goods这时,goods被test1 锁着,所以test2 一直等待,money被test2锁着,test1 一直等待。
造成死锁。

解决方案 »

  1.   

    为什么不设置Thread.sleep能运行?,还有我前面的说法是否正确?
      

  2.   

    你前面说的是对的,谁先获得锁,谁就先执行。
    为什么不设置Thread.sleep能运行? 这个是偶然情况
    线程的执行是在你start线程后,然后由系统分时间片给线程,然后线程正式执行的
    不加Thread.sleep 的时候,在第一个线程启动后的瞬间,它可能就执行完了,这时候第二个线程还没有start,这样就不存在死锁了。
    加了Thread.sleep之后,就是在第一个线程拿到第一个锁之后,让它等一会儿,这样有足够的时候,让第二个线程去start,去执行,让第二个线程也拿到锁,然后就互相等待,造成死锁情况。
      

  3.   

    你前面说的是对的,谁先获得锁,谁就先执行。
    为什么不设置Thread.sleep能运行? 这个是偶然情况
    线程的执行是在你start线程后,然后由系统分时间片给线程,然后线程正式执行的
    不加Thread.sleep 的时候,在第一个线程启动后的瞬间,它可能就执行完了,这时候第二个线程还没有start,这样就不存在死锁了。
    加了Thread.sleep之后,就是在第一个线程拿到第一个锁之后,让它等一会儿,这样有足够的时候,让第二个线程去start,去执行,让第二个线程也拿到锁,然后就互相等待,造成死锁情况。
    这样test2还没有执行,也就不会去锁monny?也就是test线程把Object两个资源都拿到,然后就已经执行完了
      

  4.   

    是滴,就是这个道理
    所以,测试死锁的时候,经常会让线程sleep一会儿,等待一下其它的线程
      

  5.   

    是滴,就是这个道理
    所以,测试死锁的时候,经常会让线程sleep一会儿,等待一下其它的线程
    谢谢大神了