2016-10-03 57 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