JAVA 堆栈知识和Volatile关键字
以下两个程序均不能达到预期效果(即num=100的期望)
package com.test.thread; public class VolatileSample { private static int num=0; public static void main(String[] args) { for (int i = 0; i < 100; i++) { new Thread(new Runnable() { @Override public void run() { num++; } }).start(); } System.out.println("num: "+num); } }
上面的程序无法总是得出正确的结果,是因为一个任务做出地修改,即使在不中断地意义上讲是原子性的,对其他任务也可能是不可视的(例如,修改只是暂时性地存储在本地处理器地缓存中),因此不同的任务对应用的状态有不同的视图。另一方面,同步机制强制在处理器系统中,一个任务做出的修改必须在应用中是可视的。如果没有同步机制,那么修改时可视将无法确定。
public class Client { private static volatile int num = 0; public static void main(String[] args) { for (int i = 0; i < 100; i++) { new Thread(new Runnable() { @Override public void run() { num++; } }).start(); } System.out.println("num: " + num); } }
上面的程序中,num虽然对各个线程具有可视性,但是num++却不是原子操作。