public class DeadLock implements Runnable {        private boolean flag;        static Object o1 = new Object(), o2 = new Object();        public void run() {
                 System.out.println(flag);
                if (flag) {
                        synchronized (o1) {
                                try {
                                         Thread.sleep(500);
                                 } catch (InterruptedException e) {
                                         e.printStackTrace();
                                 }
                                synchronized (o2) {
                                         System.out.println("AAA");
                                 }
                         }                 } else {
                        synchronized (o2) {
                                try {
                                         Thread.sleep(500);
                                 } catch (InterruptedException e) {
                                         e.printStackTrace();
                                 }
                                synchronized (o1) {
                                         System.out.println("BBB");
                                 }
                         }                 }         }        public static void main(String[] args) {
                 DeadLock aaa = new DeadLock();
                 DeadLock bbb = new DeadLock();
                 aaa.flag = true;
                 bbb.flag = false;
                 Thread thA = new Thread(aaa);
                 Thread thB = new Thread(bbb);
                 thA.start();
                 thB.start();
         }
}为什么要执行Thread.sleep(500);不执行它不好用,为什么呢不明白,请高手讲解

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【skyearthsea】截止到2008-07-09 19:42:06的历史汇总数据(不包括此帖):
    发帖的总数量:27                       发帖的总分数:450                      每贴平均分数:16                       
    回帖的总数量:21                       得分贴总数量:2                        回帖的得分率:9%                       
    结贴的总数量:26                       结贴的总分数:440                      
    无满意结贴数:4                        无满意结贴分:60                       
    未结的帖子数:1                        未结的总分数:10                       
    结贴的百分比:96.30 %               结分的百分比:97.78 %                  
    无满意结贴率:15.38 %               无满意结分率:13.64 %                  
    值得尊敬
      

  2.   

    Thread thA = new Thread(aaa);
     Thread thB = new Thread(bbb);
      thA.start();
      thB.start();你的 thA.start();先执行,运行后结果都打印出来后才执行thB.start();
    所以你的加锁是不影响的。
    当你添加了Thread.sleep(500);thA.start();将对象锁住,等待时间结束,同时thB.start();也运行了也将也对象锁住
    时间一到,两个线程同时运行时发现都在等待对方解锁。
      

  3.   

    Thread.sleep(500); 其实就是找个时间差目的就是让A线程执行到synchronized (o2) {
                                             System.out.println("AAA");
                                     }
                                      的时候,
    线程B执行到synchronized (o2) {
                                    try {
                                             Thread.sleep(500);
                                     } catch (InterruptedException e) {
                                             e.printStackTrace();
                                     }你设成Thread.sleep(50)或许也能造成死锁
      

  4.   

    sleep(500)是要确保两个线程能同时死死咬住自己的资源。上面的程序要演示的死锁情形是:thA咬住了o1,同时thB咬住了o2thA在咬住o1不松口的情况下,还等要o2
    thB在咬住o2不松口的情况下,还想要o1这样,两个线程都无休止的等待对方松口,从而都无法结束。咬住的操作是由synchronize后面的代码块({}中的语句序列)实现的,synchronize代码块的执行期间,线程将咬住(锁定)synchronize语句中制定的对象。sleep(500)保证了线程将咬住对象500毫秒以上。可以这样想象执行序列:1、a启动,咬住了o1后,暂停500毫秒;
    2、b启动,咬住了o2,暂停500毫秒;
    3、a完成了500毫秒暂停,尝试咬住o2,由于b没有松口(synchronize(o2)代码段没有退出),a等待b松口;
    4、b的情形一样,等待a松口;于是,两个线程无限等待下去,程序无法退出了。
      

  5.   

    由于o1,o2为static变量,无论你new多少个对象都只有一份。两个线程同时对两个变量进行加锁,这样,很容易出现死锁。
      

  6.   

    首先你想要死锁,要给予每个线程拿到自己首先要拿到的对象的机会。
    sleep就是 给B机会了
    否则可能在执行线程A的时间片的时候,它就把两个对象都给拿到了,那怎么能形成死锁?