で私自身のセマフォは、私はJavaで私自身のセマフォを実装したい 私はそのようにそれを実装している(ちょうど練習のために、私はセマフォクラスがあることを、認識しています)私は開始javaの
public class MyThread extends Thread {
private static MySemaphore semaphore = new MySemaphore();
public void run(){
for (int i = 0; i < 100; i++) {
semaphore.take();
try {
Main.myVariable += 1;
semaphore.release();
} catch (Exception e){
System.out.println("Exception" + e.getMessage());
}
}
}
}
と、このようにスレッドに参加:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static int myVariable = 0;
private static int threadsNumber = 100;
public static void main(String[] args) {
List<Thread> allThreads = new ArrayList<>();
for (int i = 0; i < threadsNumber; i++) {
allThreads.add(new Thread(new MyThread()));
}
for (int i = 0; i < threadsNumber; i++) {
allThreads.get(i).start();
}
for (int i = 0; i < threadsNumber; i++) {
try{
allThreads.get(i).join();
} catch (Exception e){
System.out.println(e.getMessage());
System.out.println("********************************");
}
}
System.out.println("Result is " + myVariable);
}
}
Iなどのスレッドでそれを使用しようとしています10000回変数をインクリメントして結果を受け取るだけです。セマフォなしでは、結果は10000未満(9923,9684など)です。これは、インクリメントの非アトミック性によって引き起こされます。私はセマフォを使ってこの変数を保護したい。
残念ながら、結果は依然として10000以下です(しかし、9990を超える9のケースでは、はるかに近くなります)。 なぜそれが起こるか考えていますか?私のセマフォーが間違っているのですか、スレッドを起動するのに何か問題がありますか?
あなたが 'take'と混ぜ' release'を得たようです。 'take'(最初の操作)は待たなければならず、' release'は通知しなければなりません。 – JimmyB
あなたは正しいです、メソッド名を入れ替えても機能しますが、私はちょうど良いメソッドを持っていましたが、間違った名前で(そしてそれに続くものは不適切に使用しました) – Dawid
あなたは 'AtomicInteger'を使ってみましたか? – diginoise