BBS水木清华站∶精华区

发信人: rockhead (一夜好眠), 信区: Java        
标  题: Re: 请教线程的同步与互斥 
发信站: BBS 水木清华站 (Thu Jan 11 11:23:29 2001) 
 
 
多谢muslov大虾的指点,看来Java中的线程的互斥同步机制还是相当的复杂的 
 
我最近写的一个Java程序中需要用到消息队列。我希望能够在消息队列类的内 
部处理所有的同步与互斥问题,从而减轻调用者的复杂度。这很明显是一个生 
产者消费者问题。其中put()方法用于放入消息,如果队列已满则会等待直到 
队列有空间;get()方法用于取出消息,如果队列已空则会等待队列内有消息 
方法才返回。因为是消息队列,所以必须保证消息以存入的顺序取出,并且 
能且只能取出一次。该消息队列应该能够在多个生产者,多个消费者线程共享 
的情形下正常工作。 
 
为这个类我忙了好些天,脑袋都大了一圈,可是我发现在单个消费者单个生产 
者的情况下,类工作的很正常,一旦使用多个生产消费者时,总会出现一些 
莫名其妙的错误,而且这种线程同步的程序极难调试,所以我想想这种较为 
通用的消息队列的类前人一定也遇到过,是不是有一些现成的解决方案呢? 
 
请指点迷津。 
 
 
 
【 在 muslov (刚刚好) 的大作中提到: 】 
 线程在不同时刻有不同的状态,正在被执行时,即占有CPU时 
 我们称之为Running状态。那么其它的状态线程自然是不能运行啦。 
 很可能有多个线程都不能运行吧,但它们不能运行的原因却是各不相同的。 
 那么由于相同原因不能运行的线程就会存在一个“池pool”中。 
 由于虚拟机线程调度而不运行的,处于 Runnable池中,表示万事俱备, 
 只差CPU,由于使用synchronized而阻塞的线程就会在对象锁 
 (object's lock pool)池中等待。而同步的方法中调用wait()后,线程则会 
 在wait池中等待。这里要注意了,首先wait()方法能得到执行说明当前线程 
 正在运行(在Running状态),从而说明它肯定拥有对象锁;第二,调用 
 wait()方法进入阻塞状态时,当前线程将释放对象锁(!!)第三, 
 在notify()或notifyAll()方法唤醒此线程时,它将进入 object's lock pool 
 ................... 
 
-- 
 
※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.119.230.80] 

BBS水木清华站∶精华区