Реализовать параллельную очередь так, чтобы бесконечные потоки могли выполнять операцию 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
?