代码未正确同步,这就是问题所在。
您的代码中允许以下执行顺序:
- 第一个线程看到
chk == true
,将其设置为false
并进入if
块。 - 第二个线程看到
chk == false
,将其设置为true
并进入if
块。
现在,您在自己的
if块中都有2个线程,准备执行以下操作:
incrementAndGet()
数字- 打印它。
因此,您绝对无法控制将要发生的事情。
- 您可以调用任何线程
incrementAndGet()
,因此可以先打印线程“ Odd”,首先打印奇数,然后再打印偶数。 - 您可以让第一个线程循环打印数字,看看条件是否再次满足(因为第二个线程已再次设置
chk
为true
打印,所有这些都在第二个线程有机会打印之前)。
如您所见,要获得所需的结果,必须原子完成以下操作:
compareAndSet()
布尔值incrementAndGet()
数字- 打印它
如果这3个操作不是原子操作,则可以安排线程以任何可能的顺序运行这些操作,而您无法控制输出。实现此目的的最简单方法是使用同步块:
public static void main(final String... args) { final Object o = new Object(); // ... thread 1 ... synchronized(o) { if (boolean is in the expected state) { change boolean, get number, increment, print } } // ... thread 2 ... synchronized(o) { if (boolean is in the expected state) { change boolean, get number, increment, print } }}


