public class Volatile { volatile boolean flag; public void shutdown() { flag = true; } public void doWork() { String name = Thread.currentThread().getName(); System.out.println(name); int count = 0; while (!flag) { count++; } System.out.println(name + "stop count:" + count); } public static void main(String[] args) { Volatile vo = new Volatile(); Executor executor = Executors.newFixedThreadPool(10); for (int i = 0; i < 10; i++) { executor.execute(new Runnable() { @Override public void run() { vo.doWork(); } }); } vo.shutdown(); } }
结果展示:
pool-1-thread-1 pool-1-thread-2 pool-1-thread-3 pool-1-thread-4 pool-1-thread-5 pool-1-thread-6 pool-1-thread-7 pool-1-thread-8 pool-1-thread-9 pool-1-thread-10 pool-1-thread-10stop count:11363118 pool-1-thread-8stop count:11487065 pool-1-thread-9stop count:11278783 pool-1-thread-3stop count:102096031 pool-1-thread-5stop count:62851854 pool-1-thread-1stop count:106205501 pool-1-thread-2stop count:108069058 pool-1-thread-7stop count:15173339 pool-1-thread-4stop count:98947278 pool-1-thread-6stop count:55326596
flag如果不用volatile标示,则各个线程不会停止。
因为shutdown为主线程行为,flag变量早已经从主内存备份到了工作内存。