Мой пользовательский семафор не работает в моей программе - PullRequest
0 голосов
/ 07 ноября 2019

В основном у меня есть метод, который я хочу синхронизировать (впускаю только один поток за раз), однако мне не разрешено использовать ключевое слово 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 является параллельным, но не повышается по порядку (состояние гонки). Я не уверен, что я делаю не так, любой совет?

...