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