为了通过 Java 学习同步,我只是在搞一些简单的事情,比如创建线程之间共享的计数器。
我遇到的问题是我无法弄清楚如何在 100% 的时间内按顺序打印计数器。
int counterValue = this.counter.incrementAndGet();
System.out.println(this.threadName + ": " + counterValue);
上面增加AtomicInteger counter
,获取新值,并将其打印到由负责该更新的线程名称标识的控制台。当该incrementAndGet()
方法似乎导致 JVM 在打印当前线程的更新值之前上下文切换到另一个线程进行更新时,就会出现问题。这意味着在线程返回执行状态之前,该值会递增但不会打印。查看此示例输出时,这一点很明显:
Thread 3: 4034
Thread 3: 4035
Thread 3: 4036
Thread 1: 3944
Thread 1: 4037
Thread 1: 4039
Thread 1: 4040
Thread 2: 3863
Thread 1: 4041
Thread 1: 4043
您可以看到,当执行返回到线程 1 时,它会打印其值并继续更新。线程 2 也是如此。
我有一种感觉,我错过了一些非常明显的东西。