分析该问题时建议了解过阻塞队列的实现

示例代码:

public void put(Object obj) throws InterruptedException{
    synchronized (this) {
        while(count == items.length)
            this.wait();
        inqueue(obj);//省略,包含notifyAll逻辑
    }
}

public Object take() throws InterruptedException{
    synchronized (this) {
        while(count == 0)
            this.wait();
        return outqueue();//省略,包含notifyAll逻辑
    }
}

场景:
2个消费者线程C1、C2, 2个生产者线程P1、P2,队列大小为1
分析:
C1、C2消费,此时队列数据为空,都进入waiting状态
P1、P2生产,P1生产数据后若使用notify,则可能通知到的是P2,但P2生产时队列的数据已满,又进入waiting状态,若没有其他的线程进入,此时的状况是C1、C2、P2都处于waiting状态,队列中有一条数据,这样就明显产生问题了
若使用notifyAll,所有waiting状态的线程都有可能抢占锁,让消费者有可能消费数据


lianh
1 声望0 粉丝