[英]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
。” 这将解决两个问题;
AtomicInteger
实例是可变的,并且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.