繁体   English   中英

Java 多线程计数器不工作

[英]Java multi threaded counter is not working

我正在尝试 Java 多线程计数器。 我首先尝试在没有任何同步的情况下观察竞态条件。 但是我的计数器没有被工作线程增加。

代码 - 主要方法

public static void main(String... args) {

    System.out.println("Program started");
    Integer sum = 0;
    System.out.println("Initial Sum : " + sum);

    for (int i = 0; i < 100; i++) {
        WorkerThread workerThread = new WorkerThread(sum, i);
        workerThread.run();
    }

    System.out.println("Final Sum : " + sum);

}

代码 - WorkerThread class

public class WorkerThread implements Runnable {

    private Integer localSum;


    public WorkerThread(Integer sum, int i){
        localSum = sum;
        System.out.println(localSum);
    }

    @Override
    public void run() {
        localSum += 1;
    }
}

我想知道为什么增加localSum不会影响 Integer 包装器 object sum sum值保持在 0。谁能帮我弄清楚如何将 Integer 包装器传递到线程中并增加原始值?

问题是localSum += 1并没有做你认为它做的事情。

Integer对象是不可变的:您不能更改Integer的值。 localSum+=1语句创建一个Integer实例,并将localSum变量更改为引用新实例。 同时, main()例程的sum变量总是会引用原始的、不可变的实例。

@Murat Karagöz 说,“使用AtomicInteger 。” 这将解决两个问题;

  1. AtomicInteger实例可变的,并且
  2. ai.incrementAndGet()操作和其他AtomicInteger操作是线程安全的。

您的程序,如所写,不需要线程安全,但是一旦您更改它以实际创建多个线程,需要它。

如果您将所有AtomicInteger变量设为final ,它将帮助您正确处理。 例如;

public class WorkerThread implements Runnable {
    private final AtomicInteger localSum;

    public WorkerThread(AtomicInteger sum, int i){
        localSum = sum;
        System.out.println(localSum.get());
    }
    ...
}

您不想意外更改localSum字段的值(即,您不想更改它指向的AtomicInteger实例)您想改变AtomicInteger实例本身。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM