实施并发队列,以使无限线程可以执行
peek()
操作,但是在特定时间只有poll()
和offer()
可以执行。另外,如果线程想要poll()
空队列,则它应该等待直到队列中有一个项目,然后执行poll()
。
class ConcurrentQ{
Semaphore mutex = new Semaphore(1, true);
Semaphore db = new Semaphore(1, true);
Semaphore full = new Semaphore(0, true);
Queue<Integer> list = new LinkedList<>();
volatile int peekers = 0;
public void push(int x){
db.acquire();
list.push(x);
full.release();
db.release();
}
//Must look at empty case
public int pop(){
full.acquire();
db.acquire();
int x = list.pop();
db.release();
return x;
}
public int peek(){
mutex.acquire();
if(peekers == 0){
db.acquire();
}
++peekers;
mutex.release();
int val = list.front();
mutex.acquire();
if(peekers == 1){
db.release();
}
--peekers;
mutex.release();
return val;
}
}
这是我的实现方式,我觉得大多数情况下是正确的(有人可以帮我检查一下吗?)。我对pop()
方法特别感到困惑。 full
信号灯的使用正确吗?