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水木清华站∶精华区