2016-10-03 22 views
-1

我想實現一個計數器使用原子整數,然後在所有線程完成其任務後,打印最終值,但我沒有得到最新值,在我的情況下,我應該的價值獲得應該是20,但它是波動像17,18,16,19,20等原子整數增量程序不按預期工作

程序如下:

class AtomicOperations implements Runnable 
{ 
private AtomicInteger ai; 
private int a; 

AtomicOperations(int aivalue, int ivalue) { 
    ai = new AtomicInteger(aivalue); 
    this.a = ivalue; 
} 

@Override 
public void run() { 
    ai.getAndIncrement(); 
} 

    public static void main(String args[]) { 
    AtomicOperations obj = new AtomicOperations(10, 10); 
    Thread[] t = new Thread[10]; 
    synchronized (obj) { 
     for (int i = 0; i < t.length; i++) { 
      t[i] = new Thread(obj, "Thread-" + (i + 1)); 
      t[i].start(); 
     } 
    } 
    System.out.println(obj.ai); 
    } 
} 
+1

你覺得你的'synchronized(obj)'有什麼好處? – Kayaman

+0

原子不需要同步。 –

+0

@Kayaman ..我認爲這可能會完成打印語句運行之前的所有線程 – Amol

回答

0

你是不是等到線程完成的,因此數量您打印時完成的增量可能會有所不同。

+0

我添加了一個同步塊..我認爲這是我做的 – Amol

+1

你將永遠不會*同步工作,如果你撒了東西而不理解*精確*你需要什麼樣的同步。在這裏,你需要的是一些知道線程何時完成的方法。一個'synchronized'塊不會等待某件事完成,它不會在中間中斷它。 (或多或少)。儘管它沒有做任何事情,但它沒有保護任何共享的東西。 –

+0

點採取...主執行將超越同步塊..所以我需要使用連接()? – Amol