Java 同步问题

Java Synchronization Trouble

我是 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 上同步。