当前页面: 开发资料首页 → J2SE 专题 → 多线程的一点疑惑(高手入) 
多线程的一点疑惑(高手入) 
摘要: 多线程的一点疑惑(高手入)  
程序中会有两个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.  }
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();
楼上的没看懂我的问题.
帮顶
哪有什么死等的几率,从概率上讲0。000000000001就是0 肯定就是deadlock了。
如果加上sleep,
ThreadB很快就执行完了。那么就没有人去notify ThreadA了,所以就deadlock了。