【发布时间】:2018-10-12 07:02:14
【问题描述】:
该练习与 Effective Java 中的第 78 项有关。即,我们创建两个线程,并行增加公共静态变量并将其打印出来。目标是为控制台生成一条不断增加的数字线。 AtomicLong 用于避免竞争条件,但有一个我无法解释的错误。 即,第一次调用
System.out.println(i.getAndIncrement());
JVM 不会读取最新的变量值。只有在第二次调用时才会读取。 Please see the console output with inconsistent output marked 有人可以建议我自己学习什么来清除这个错误吗?是时候阅读 JVM 规范了吗?
package com.util.concurrency.tick;
import java.util.concurrent.atomic.AtomicLong;
public class AtomicIncrementer implements Runnable {
private String name;
private static final int MAXI = 1000;
private static final AtomicLong i = new AtomicLong(-1);
public AtomicIncrementer(String name){
this.name = name;
}
public void run(){
while(i.get() < MAXI){
System.out.println(name+ ". i = "
+i.getAndIncrement());
}
System.out.println(name+" i = "+i.get());
}
public static void main(String[] args){;
try {
Thread t1 = new Thread(new AtomicIncrementer("A"));
Thread t2 = new Thread(new AtomicIncrementer("B"));
t1.start();
t2.start();
} catch (Exception e) {
}
System.out.println("Two incrementers launched");
}
}
【问题讨论】:
-
线程之间根本没有同步,因此无法预测值的打印顺序。仅仅因为
AtomicLong可以原子地获取和增加一个值并不会自动使您的线程中的循环和打印语句同步。
标签: java concurrency static atomic println