java中关于volatile关键字的疑问


很多文章介绍volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。但是又说volatile修饰的变量不支持原子操作,也就是n=n+1这样的操作并不能保证是线程安全的。不是每次操作都是从内存读都是从主存中读取,每次改变都会写到主存中,不允许线程保存副本吗?这样为什么还不能保证线程原子操作呢?

java 多线程

trombe 12 years ago

我的理解:volatile变量保证读取的变量值是最新的即不受缓存的影响,每次都从内存中读取最新值;原子操作是指像n=n+1这样的操作其实在汇编级或者在处理器流水线级别的操作中是多步骤的,在多线程或者多进程的情况下容易产生竞争,所以会用软件锁或者硬件指令锁住总线等方式确保n=n+1一类的操作不受到其他线程或进程的影响。你可以看下这篇文章,你的疑问应该和作者提到的第3种情况相同:
Java中关于原子操作和volatile关键字

SunnY耀 answered 12 years ago

Your Answer