0

スレッドがインクリメント方法を実行した後のコードでは、値2をコンソールに出力します。 1でインクリメントしますか?以下のコードは、1ではなく2でインクリメントするのはなぜですか?(New to Java)

class TestSync implements Runnable { 
private int balance; 

public void run() { 

    for(int i = 0; i < 50; i++){ 

     increment(); 
     System.out.println(Thread.currentThread().getName() + " balance after increment is " +balance); 
    } 

} 

private synchronized void increment() { 

    int i = balance; 
    balance = i + 1; 
    // System.out.println(balance); 
} 

}

パブリッククラスTestSyncTest {

public static void main(String[] args) { 

    TestSync job = new TestSync(); 
    Thread a = new Thread(job); 
    Thread b = new Thread(job); 
    a.setName("Thread A"); 
    b.setName("Thread B"); 

    a.start(); 
    b.start(); 

} 

}

+1

:ここ

は簡単な例ですか? – tkausl

+0

既存の 'System.out.println'をコメントアウトし、あなたがコメントアウトしたもののコメントを外してみてください。 –

+0

私の答えを確認できますか? – KeLiuyue

答えて

0

コードは、ループ内にある.AND balanceはグローバルデータであるので。

最初のループでは、balanceの値は1です。

for (int i = 0; i < 50; i++) { 

     increment(); 
     System.out.println(Thread.currentThread().getName() + " balance after increment is " + balance); 
} 

OUTPUT

//   i  balance 
// first 0   1 
// second 1   2 
// third 2   3 
// ... 
+0

私はあなたが説明しようとしているロジックを理解しています。printステートメントは、1ではなく2から始まる値を出力します。それは私を混乱させます。 –

+0

あなたはそれをデバッグすることができます。 – KeLiuyue

0

あなたのインクリメント方法が同期されますが、バランス変数はスレッドで共有されます。最初のスレッドがインクリメントを呼び出した後、バランスを印刷する前に、もう一方のスレッドはインクリメントを呼び出すことができます。インクリメントメソッド内にprintステートメントを置く。

0

両方のスレッドが同じオブジェクトを共有します。唯一の同期メソッドはiの値をインクリメントしますが、値を印刷するときに印刷するときの順序を保証するものではありません。

各メソッドにインクリメント後の値を出力させる場合は、run()から、sysoutのコメントを解除して削除します。

印刷する前にすべてのスレッドが終了すると思われる場合は、Thread.join()を使用する必要があります。それらのいずれかが値をプリントアウトして取得する前に、両方のスレッドが値をインクリメントしたらどう

class TestSync implements Runnable { 
    private int balance; 

    public void run() { 

     for(int i = 0; i < 50; i++){ 
      increment(); 
     } 

    } 

    private synchronized void increment() { 

     int i = balance; 
     balance = i + 1; 
    } 

    public void printBalance() ´{ 
     System.out.println("Balance: " + balance); 
    } 
} 

public static void main(String[] args) { 

    TestSync job = new TestSync(); 
    Thread a = new Thread(job); 
    Thread b = new Thread(job); 
    a.setName("Thread A"); 
    b.setName("Thread B"); 

    a.start(); 
    b.start(); 

    try { 
     System.out.println("Wait for threads to finish."); 
     a.join(); 
     b.join(); 
    } catch (InterruptedException e) { 
     System.out.println("Interruption waiting for threads to finish."); 
    } 
    a.printBalance(); // either method will print the same value. 
} 
関連する問題