В основном у меня есть метод, который я хочу синхронизировать (впускаю только один поток за раз), однако мне не разрешено использовать ключевое слово synchronized для этой конкретной практики. Вместо этого я решил создать семафор и просто установить значение 1, поэтому он действует как взаимоисключающая блокировка (что, как я полагаю, делает синхронизированное ключевое слово правильно?).
Так что в основном мой класс Semaphore выглядитвот так:
import java.util.*;
public class Semaphore
{
private int count = 0;
public Semaphore (int init_val) {
count = init_val;
}
public synchronized void P() {
count = count - 1;
while(count < 0) {
try {
wait();
} catch(InterruptedException e) {
}
}
}
public synchronized void V() {
count = count + 1;
notifyAll();
}
}
И я использую его внутри метода, который хочу синхронизировать, вот так (просто пример):
Semaphore s = new semaphore(1);
int x = 0;
public void add() {
s.P()
int x = x + 1;
System.out.println(x);
s.V()
}
У меня 100 потоков, вызывающих метод add, но по какой-то причине значение x является параллельным, но не повышается по порядку (состояние гонки). Я не уверен, что я делаю не так, любой совет?