实现并发队列

时间:2018-09-13 04:05:46

标签: java multithreading data-structures concurrency operating-system

  

实施并发队列,以使无限线程可以执行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信号灯的使用正确吗?

0 个答案:

没有答案