我试图在Java中编写一个简单的有界缓冲区,但是在最初的几次操作之后,程序似乎陷入了僵局。
public BoundedBuffer(int size){
buffer = new LinkedList<E>();
this.empty = new Semaphore(size);
this.full = new Semaphore(0);
this.mutex = new Semaphore(1);
}
public void produce(E element) throws InterruptedException {
this.empty.acquire();
this.mutex.acquire();
this.buffer.add(element);
this.mutex.release();
this.full.release();
}
public E consume() throws InterruptedException{
this.full.acquire();
this.mutex.acquire();
E elem = this.buffer.remove(0);
this.mutex.release();
this.full.release();
return elem;
}
这些是我的产品和消费方法,他们应该避免死锁。但是程序总是挂起。我错过了什么吗?
编辑:还添加了我的构造函数。
答案 0 :(得分:1)
我认为您可能在this.empty.acquire()
时遇到问题而从不致电this.empty.release()
。最终empty
将用完许可证。