Java 在信号量中调用wait()之前打印

Java 在信号量中调用wait()之前打印,java,concurrency,Java,Concurrency,我试图用Java实现一个有界缓冲区,以了解更多关于并发性的知识。几个线程将使用add()和remove()方法访问此缓冲区。我使用三个信号量来实现这一点(一个用于可用项的数量,可用空间的数量,以及一个用于关键部分的二进制信号量)。当缓冲区满/空时,我想分别打印“缓冲区满”或“缓冲区空” 在信号量中调用wait()之前,我已经将print语句设置为full/empty。然而,这似乎是打印满/空远远超过它应该和在错误的时间。我认为这是在错误的时间进行的上下文切换。我应该更改打印对账单的位置吗 My信

我试图用Java实现一个有界缓冲区,以了解更多关于并发性的知识。几个线程将使用add()和remove()方法访问此缓冲区。我使用三个信号量来实现这一点(一个用于可用项的数量,可用空间的数量,以及一个用于关键部分的二进制信号量)。当缓冲区满/空时,我想分别打印“缓冲区满”或“缓冲区空”

在信号量中调用wait()之前,我已经将print语句设置为full/empty。然而,这似乎是打印满/空远远超过它应该和在错误的时间。我认为这是在错误的时间进行的上下文切换。我应该更改打印对账单的位置吗

My
信号量
类,该类可以使用prtstmt参数打印满/空

public class Semaphore {

  private String prtstmt;
  private int count;

  public semaphore(String prtstmt, int count) {
    this.count = count;
    this.prtstmt = prtstmt;
  }

  public synchronized void V(){
    count = count + 1;
    notify();
  }

  public synchronized void P(){
    count = count - 1;
    if (count < 0) {
      System.out.println(prtstmt);
      wait();
    }
  }

}

本机信号量执行类似的操作

boolean acquired = semaphore.tryAcquire();
if (acquired) {
    System.out.println("Got it!");
    semaphore.release();
} else {
    System.out.println("Returned immediately, would have blocked");
}
来源:

Consumer consuming item 5
Buffer empty!
Producer is trying to insert item 6
Producer is trying to insert item 7
Consumer consuming item 6
Producer is trying to insert item 7
Consumer consuming item 6
Buffer empty!
Consumer consuming item 5
Buffer empty!
Producer is trying to insert item 6
Producer is trying to insert item 7
Consumer consuming item 6
boolean acquired = semaphore.tryAcquire();
if (acquired) {
    System.out.println("Got it!");
    semaphore.release();
} else {
    System.out.println("Returned immediately, would have blocked");
}