每次您对进行同步时,syncObject都会发生变化(会将其转换为原始int,对其进行递增,然后将其自动装箱回到Integer对象。Integer对象是不可变的……一旦创建,它们就无法更改。
最糟糕的是,您并没有在所有线程中使用相同的syncPObj,不同的线程在不同的时间使用不同的syncObject进行同步。
使用一个对象作为同步(称为syncObj),并将其声明为最终对象:
private static final Object syncObject = new Object();
然后,您的计数器应该是用于性能的原始(int),称为“计数器”之类的东西。
在syncObject上同步,并增加计数器。
编辑:根据@jsn,完成标志也被破坏,因为您的代码在isAllDone()方法上有一个“紧循环”,这是一种不好的做法。您应该使用thread [i]
.join()等待(阻塞)每个线程的完成,然后从中检查状态。使用ExecutorService是“正确的方法”。



