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