程序中会有两个Thread对象: main Thread和ThreadB
当b.start();执行后, ThreadB进入Runnable状态,然后main Thread继续运行6行. 
此时两个Thread可能进入Runnable状态.如果是main线程获得了b的对象lock, 那么everything is OK.
但是如果 ThreadB先获得对象lock的话,那当它执行完run()方法后, 再执行line 6的时候b.wait()就会一直等待下去. 上面的是我的分析.但为什么我反复运行下面代码的时候,却没有发生line 6 b.wait()一直等待的情况呢???
注:当我在line 5的位置加上Thread.sleep(1000);的时候, b.wait()就开始死死等待了.但没有这句话也应该有死等的几率的. 还有如果b.wait()一直等待, 这个是否应该算deadlock?还是其它名字. 1.  class ThreadA {
 2.     public static void main(String [] args) {
 3.        ThreadB b = new ThreadB();
 4.        b.start();
 5.
 6.        synchronized(b) {
 7.           try {
 8.             System.out.println("Waiting for b to complete...");
 9.             b.wait();
10.           } catch (InterruptedException e) {}
11.           System.out.println("Tota7. is: " + b.total);
12.        }
13.     }
14.  }
15.
16.  class ThreadB extends Thread {
17.     int total;18.
19.     public void run( ) {
20.        synchronized(this) {
21.           for(int i=0;i<100;i++) {
22.              total += i;
23.           }
24.           notify( );
25.        }
26.     }
27.  }

解决方案 »

  1.   

    public class cs {
        boolean available = true;    public synchronized boolean enter() {
          while (available == false) {
            try {
              wait();
            }
            catch (InterruptedException e) {
              return false;
            }
          }
          available = false;
          return true;
        }    public synchronized void leave() {
          available = true;
          notify();
      }
    }
    ////////////////////////////////////////////////////下面是用法
    private cs cs = new cs();
    cs.enter();
    xxx.setxxx(xxx);
    cs.leave();
      

  2.   

    哪有什么死等的几率,从概率上讲0。000000000001就是0 肯定就是deadlock了。
    如果加上sleep,
    ThreadB很快就执行完了。那么就没有人去notify ThreadA了,所以就deadlock了。