前段时间面试的时候问到的一个问题,实现一个线程安全的计数器,我已经让类变成Singleton了,set方法也变成同步的了,这个时候面试的人问,如果这个程序是工作在多CPU的机器上,发现这个计数器仍然存在计数不准确的情况会是因为什么?我的回答是:JDK的bug,呵呵,面试的人说不是,JDK提供了修正的机制,就是把计数的那个变量标记为volatile,这样就可以防止,今天有空搜索了下这个关键字,发现我以前翻译的一个文章《破除java神话之三:原子操作都是线程安全的》说的就是这个问题,虽然不是完全匹配,但是机制就是这样的,多处理器有各自的寄存器,所以可能有问题,使用volatile关键字就可以让JVM在读写那个变量的时候都从主存读写,而不在本地保存副本。