0

在下面的代碼中,在線程運行increment方法後,它將值2輸出到控制檯。不應該將值設爲1,因爲方法用1遞增?爲什麼下面的代碼增加2而不是1?(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

因爲你的代碼是在循環中。而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語句輸出的是從2開始而不是1開始的值,這就是讓我困惑的原因。 –

+0

你可以調試它,讓你更容易理解 – KeLiuyue

0

你的增量方法是同步的,但平衡變量由線程共享。在第一個線程調用增量之後,在可以打印餘額之前,另一個線程可以調用增量。將print語句放在increment方法中。

0

兩個線程共享同一個對象。唯一的同步方法會增加i的值,但不能保證在打印該值時它們將不會爲打印它的狀態而執行的順序。

如果您希望每種方法都在增量後打印其值,請從同步方法中取消註釋sysout並將其從run()中刪除。

如果您希望在打印之前完成所有線程,則需要使用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. 
} 
相關問題