import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;
public class Main implements Runnable {
private final CountDownLatch cdl1 = new CountDownLatch(NUM_THREADS);
private volatile int bar = 0;
private AtomicInteger count = new AtomicInteger(0);
private static final int NUM_THREADS = 25;
public static void main(String[] args) {
Main main = new Main();
for(int i = 0; i < NUM_THREADS; i++)
new Thread(main).start();
}
public void run() {
int i = count.incrementAndGet();
cdl1.countDown();
try {
cdl1.await();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
bar = i;
if(bar != i)
System.out.println("Bar not equal to i");
else
System.out.println("Bar equal to i");
}
}
每个都Thread
进入 run 方法并int
通过i
从被AtomicInteger
调用的count
. 然后每个Thread
等待被CountDownLatch
调用cdl1
(当最后一个Thread
到达闩锁时,所有Threads
都被释放)。当闩锁被释放时,每个线程都会尝试将它们的受限i
值分配给共享的volatile
,int
称为bar
。
我希望Thread
除一个之外的每个都打印出“Bar not equal to i”,但每个Thread
打印出“Bar equal to i”。呃,volatile
如果不是这个,wtf 确实会这样做?
这是一个故意的意图,每个Thread
尝试bar
在完全相同的时间设置值。
编辑:
根据答案,将代码更改为:
...
bar = i;
try {
Thread.sleep(0);
} catch(InterruptedException e) {
e.printStackTrace();
}
...
确保在变量的设置和读取之间浪费一点时间。
现在,Bar 的相同/不同值的打印是 50/50。