我是 java 新手,正在尝试与示例程序同步,以使用多线程将数字添加到 100。以下是我能够想出的代码。当我测试代码时,它有时会给出正确的值 4590,但有时不会给出正确的值。谁能指出我做错了什么
class Counter{
Integer counter = 0;
public void increment(int i){
synchronized (counter){
counter += i;
}
}
}
class ObjectTest implements Runnable{
int i;
Counter blah;
public ObjectTest(Counter counter,int i){
blah =counter;
this.i = i;
}
@Override
public void run() {
blah.increment(i);
}
}
public class SyncTest {
public static void main(String args[]) throws InterruptedException {
ThreadPoolExecutor executor = new ThreadPoolExecutor(4,10,60, TimeUnit.SECONDS,new SynchronousQueue<Runnable>(), new ThreadPoolExecutor.CallerRunsPolicy());
Counter counter = new Counter();
for (int index = 0; index < 100; index++) {
ObjectTest objectTest = new ObjectTest(counter,index);
executor.execute(objectTest);
}
executor.shutdown();
while (!executor.isTerminated()){
Thread.sleep(1000L);
}
System.out.println(counter.counter);
}
}
最佳答案
您无法在 counter
上同步,因为它是一个 Integer
,且不可变。因此 counter += i
创建一个新的 Integer
对象,该对象与同步的对象不同。
您可以将其设为int counter
,并拥有一个单独的Object lock = new Object();
,在lock
上同步。
关于Java同步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39207001/