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