public class VolatileTest2 {
private static volatile int ticket = 10;
public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(5);
while (ticket > 0) {
executorService.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + ticket--);
}
});
}
executorService.shutdown();
//Thread.sleep(100);
}
}
自己寫了這樣一段代碼,本來以爲線程池只會執行十次,結果發現最後的ticket都出現負數了。經過仔細的分析發現:
首先第一次當ticket等於10時,進入while循環,將一個任務(注意這個任務有個sleep方法)交給線程池,此時線程池裏面的任務因爲有sleep方法,還未能執行到ticket--,因此ticket仍然是10,繼續執行上述邏輯。也就是說從10變成9過程這段時間中,已經有很多個任務被扔到了線程池中。