したがって、ここでは、Java で複数のスレッドがどのように動作するかを検査する 3 つの単純なクラスを作成しますが、実行するたびに異なる結果が生成されます。コードは次のとおりです。
public class Accum {
private static Accum a = new Accum();
private int counter = 0;
private Accum(){}
public static Accum getAccum(){
return a;
}
public void updateCounter(int add){
counter+=add;
}
public int getCount(){
return counter;
}
}//end of class
public class ThreadOne implements Runnable {
Accum a = Accum.getAccum();
public void run() {
for(int x=0; x<98; x++){
//System.out.println("Counter in TWO "+a.getCount());
a.updateCounter(1000);
try{
Thread.sleep(50);
}catch(InterruptedException ex){}
}
System.out.println("one " + a.getCount());
}
}//end of class
public class ThreadTwo implements Runnable{
Accum a = Accum.getAccum();
public void run() {
for(int x=0; x<99; x++){
//System.out.println("counter in Two "+a.getCount());
a.updateCounter(1);
try{
Thread.sleep(50);
}catch(InterruptedException ex){}
}
System.out.println("two "+a.getCount());
}
public class TestThreaad {
public static void main(String[]args){
ThreadOne t1 = new ThreadOne();
ThreadTwo t2 = new ThreadTwo();
Thread one = new Thread(t1);
Thread two = new Thread(t2);
one.start();
two.start();
}
}end of class
したがって、予想される結果は次のようになります: 98098 が 1 つ、98099 が 2 つですが、結果は予測不可能であることがわかります。78000 または 81000 になることもあります。わかりません..
しかし、カウントの現在の値の行を出力するコードを追加すると、最終結果は正しいでしょう..
何が問題なのか本当にわかりません.ThreadOneとThreadTwoのrun()メソッドで同期されたキーワードを追加しても、問題はまだあります...
私は3か月間Javaを研究してきましたが、これは私が今まで直面した中で最もとらえどころのない問題です...マルチスレッドの基本的なポイントを理解するのに役立つ人がいることに感謝します...