BBS水木清华站∶精华区

发信人: rockhead (一夜好眠), 信区: Java        
标  题: 请教线程的同步与互斥 
发信站: BBS 水木清华站 (Wed Jan 10 18:30:27 2001) 
 
 
在Java中,使用synchronized关键字来进行线程的同步 
 
一个设置了synchronized关键字的方法自动成为同步方法 
进入方法则相当于以当前对象为信号量,上锁。退出时解锁。 
 
Java还提供了wait()和notify(),notifyAll()方法辅助进行同步 
wait()会解锁当前的信号量,使线程进入堵塞状态。直到使用 
同一信号量的notify()或notifyAll()来唤醒它。 
 
于是就出现了一种很有趣的情况,看下面的方法: 
 
 
public synchronized void put( int value ) { 
        while (available==true) { 
                wait(); 
        } 
        available = true; 
        content = value; 
        notifyAll(); 

 
public synchronized int get() { 
        while ( available==false ) { 
                wait(); 
        } 
        available = false; 
        notifyAll(); 
        return content; 

 
 
这是可用于生产/消费问题的共享资源类的两个方法。假设消费者 
调用get()方法,则会锁上当前的信号量,由于资源不可用(availabel==false) 
调用当前信号量的wait()方法,wait()会解锁当前的信号量。直到被notify当前 
的资源可用(即信号量解锁),在开锁的情况下等待开锁通知。 
 
我对于这种情况的理解是:被synchronized关键字限定堵塞的线程将由线程调度机制来 
唤醒,而对于wait()调用堵塞的线程将由notify()或notifyAll()来唤醒。 
 
 
上例中,到底synchronized和wait用的是不是一个信号量呢?如果是那sync和wait 
所引起的阻塞到底有什么不同呢?如果不是,为甚么必须在sync所限定的范围内部 
才能使用wait()和notify呢? 
 
 
恳请大虾指点! 
 
-- 
 
※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.119.230.80] 

BBS水木清华站∶精华区