BBS水木清华站∶精华区

发信人: muslov (刚刚好), 信区: Java        
标  题: Re: 请教线程的同步与互斥 
发信站: BBS 水木清华站 (Wed Jan 10 19:31:23 2001) 
 
线程在不同时刻有不同的状态,正在被执行时,即占有CPU时 
我们称之为Running状态。那么其它的状态线程自然是不能运行啦。 
很可能有多个线程都不能运行吧,但它们不能运行的原因却是各不相同的。 
那么由于相同原因不能运行的线程就会存在一个“池pool”中。 
由于虚拟机线程调度而不运行的,处于 Runnable池中,表示万事俱备, 
只差CPU,由于使用synchronized而阻塞的线程就会在对象锁 
(object's lock pool)池中等待。而同步的方法中调用wait()后,线程则会 
在wait池中等待。这里要注意了,首先wait()方法能得到执行说明当前线程 
正在运行(在Running状态),从而说明它肯定拥有对象锁;第二,调用 
wait()方法进入阻塞状态时,当前线程将释放对象锁(!!)第三, 
在notify()或notifyAll()方法唤醒此线程时,它将进入 object's lock pool 
 池中等待,以重新获得对象锁。状态图如下所示。 
                     Schedule 
  (Runnable)     <------------->  (Running) 
        ^                          |    \ 
        |                          |     --\ 
        |                synchronized     wait() --must hav lock 
    acquire lock                   |         \ release lock 
        |                          |          \ 
        |                          |           \     
        |          (Blocked in)    |        (Bolcked in ) 
         ----------( object's )<----        ( object's  ) 
                   ( lock pool) <---------- ( wait pool ) 
                                  notify() 
 
不知这是不是你想要的答案。 
 
 
【 在 rockhead (一夜好眠) 的大作中提到: 】 
 在Java中,使用synchronized关键字来进行线程的同步 
 一个设置了synchronized关键字的方法自动成为同步方法 
 进入方法则相当于以当前对象为信号量,上锁。退出时解锁。 
 Java还提供了wait()和notify(),notifyAll()方法辅助进行同步 
 wait()会解锁当前的信号量,使线程进入堵塞状态。直到使用 
 同一信号量的notify()或notifyAll()来唤醒它。 
 于是就出现了一种很有趣的情况,看下面的方法: 
 public synchronized void put( int value ) { 
         while (available==true) { 
                 wait(); 
         } 
 ................... 
 
-- 
 
※ 修改:·muslov 於 Jan 10 19:33:07 修改本文·[FROM:   166.111.68.91] 
※ 修改:·muslov 於 Jan 10 19:34:05 修改本文·[FROM:   166.111.68.91] 
※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.68.91] 

BBS水木清华站∶精华区