1

単一の共有変数を使用して複数のスレッドをインクリメントおよびデクリメントする場合、スレッドが同期された方法でカウントされ、値がスキップされないようにするにはどうすればよいですか。

私は3つの異なるメソッドを持つ別のクラスを作成しました.1つはインクリメントし、もう1つはデクリメントし、最後のメソッドは値を返します。それらもすべて同期されます。

結果は次の例を示しています。

  • これは Thread_4 反復です: -108/500 これは Thread_5 反復です: 291/500 これは Thread_4
    反復です
    : -109/500
    これは Thread_4 反復です: -110/500

ご覧のとおり、スレッドは減少していますが、共有変数を使用しているため、「291」にジャンプすることはありません。

** * ** * ** * ** * ** * ****編集* ** * ****

コード:- 共有変数クラス

public class shareVar extends Thread
{
    private static int sharedVariable = 0;


    public synchronized static void increment(){
        sharedVariable++;
    }

    public synchronized static void decrement(){
        sharedVariable--;
    }

    public  static int value(){
        return sharedVariable;
    }
}

-----インクリメントクラス

sVar incrementVal = new sVar();

public synchronized void display(){

    for(int countVal = 0; countVal<=max; countVal++ ){
            incrementVal.increment();
            System.out.println("This is " + threadName + " iteration: " + incrementVal.value() + " of " + max);
            //this.yield();
    }
    System.out.println("*THIS " + threadName + " IS FINISH " 
                                    + "INCREMENTING *");

}

public void run(){

    display();
}
4

2 に答える 2