volatile 可以保证变量的原子性和可视性。。 但不能保证原子操作,如++,-- 等均不是原子操作。 如需操作请使用synchronized关键字 或 Lock锁。
原子操作为,变量的取值和赋值。
volatile 保证的是long和double的原子性,因为这两个变量为64位,在JVM 中处理时看做32位,所以在并发时变量需要加上volatile修饰,保证在赋值等处理时,不会发生数据断开的情况。
当并发的共享变量需要返回,或者在多处引用时,需要注意该共享变量的可视性,保证取得的是内存中的最新值, 加入volatile修饰即可。
http://xiabin1235910-qq-com.iteye.com/admin/blogs/1571669 详细讲解了 volatile的使用及注意事项。非常有用,详细了解。
在windows核心编程一书中,用户模式下的线程同步这一章,206页 也提到volatile的使用。
保证变量每一次都从内存中取得最新值,而不是在编译器优化后,重复取得cpu寄存器的值。
详见 java编程思想并发一章的原子性与可视性。