在Java中实现多线程堆栈?

在Java中实现多线程堆栈?,java,multithreading,stack,thread-safety,Java,Multithreading,Stack,Thread Safety,实现多线程堆栈,可以自由使用现有的 堆栈的实现。除了线程安全外,它还必须阻止 (不忙等待)堆栈已满时的推线程和弹出 堆栈为空时执行线程。它必须发出信号让线程停止睡眠 当堆栈再次有空间或元素弹出时。在这个问题上,公平是可选的 如何在Java中实现这样的堆栈?我提出了以下实现方法。这是解决上述问题的正确方法吗 public class MyStack<E> { private final Stack<E> stack; private int max = 16;

实现多线程堆栈,可以自由使用现有的 堆栈的实现。除了线程安全外,它还必须阻止 (不忙等待)堆栈已满时的推线程和弹出 堆栈为空时执行线程。它必须发出信号让线程停止睡眠 当堆栈再次有空间或元素弹出时。在这个问题上,公平是可选的

如何在Java中实现这样的堆栈?我提出了以下实现方法。这是解决上述问题的正确方法吗

public class MyStack<E> {
  private final Stack<E> stack;
  private int max = 16;
  private final ReentrantLock lock = new ReentrantLock(true);
  private final Condition notEmpty = lock.newCondition();
  private final Condition notFull = lock.newCondition();

  public MyStack(int size) {
    this.stack = new Stack<>();
    this.max = size;
  }

  public void push(E e) {
    lock.lock();
    try {
      while (stack.size() == max) {
        notFull.await();
      }
      stack.push(e);
      notEmpty.signalAll();
    } catch (InterruptedException e1) {
      e1.printStackTrace();
    } finally {
      lock.unlock();
    }
  }

  public E pop() {
    lock.lock();
    try {
      while (stack.size() == 0) {
        notEmpty.await();
      }
      E item = stack.pop();
      notFull.signalAll();
      return item;
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
}
公共类MyStack{
私有最终堆栈;
私有int max=16;
私有最终重入锁定=新重入锁定(true);
private final Condition notEmpty=lock.newCondition();
private final Condition notFull=lock.newCondition();
公共MyStack(整数大小){
this.stack=新堆栈();
这个最大值=大小;
}
公共空间推送(E){
lock.lock();
试一试{
while(stack.size()=最大值){
未满。等待();
}
栈推(e);
notEmpty.signalAll();
}捕捉(中断异常e1){
e1.printStackTrace();
}最后{
lock.unlock();
}
}
公共E-pop(){
lock.lock();
试一试{
while(stack.size()==0){
notEmpty.wait();
}
E item=stack.pop();
notFull.signalAll();
退货项目;
}捕捉(中断异常e){
e、 printStackTrace();
}最后{
lock.unlock();
}
}
}

首先运行它,看看它是否工作正常。代码审查问题应在此处提交:。投票以主题外的方式结束。你应该在这里使用内在锁而不是显式锁。这对我来说是新的东西,所以我将阅读有关它的内容,但有什么区别?比这更简单。