Java同步问题

标签 java multithreading synchronization threadpool

我是 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/

相关文章:

python - Python asyncio 是否使用线程池?

python - Scipy 最小化函数似乎在自己创建多个线程?

java - 等待并通知 Controller -工作人员同步

multithreading - 条件变量的成本是多少?

java - 在数据库中创建表导致很多异常

java - 无法通过Java运行命令,但可以通过cmd运行 CreateProcess error=2, 系统找不到指定的文件

java - 在列上使用别名的查询会出错

java - 为什么下面的例子似乎反驳了 String 是 Java 中的不可变对象(immutable对象)?

C++ 线程附加/分离段错误

php - 负载平衡 PHP 的最佳方法是什么