多线程的编程中经常需要用到Volatile关键词来声明一个变量
针对使用volatile声明的变量,JVM会及时将更改的变量值从线程的内存区同步到主内存区,同时也保证线程及时的从主存储区得到最新更新。
及时的定义 - 及时是相对不用volatile修饰的变量而言
如果是synchronize,当程序进入Synchronize修饰的代码段或者方法时 JVM强制给线程内存做store-write,然后清除线程内存,保证Synchronize内部的程序在使用变量时从主内存区load-read.
当程序出了synchronize后,JVM会把线程内存store-write到主内存,但是不会清除线程内存。
如果没有使用volatile或者synchronize,则JVM不会将变量的变化及时从工作线程更新到主内存。例如
int shareVariable = 100;
for(int i=0;i<10;i++)
shareVariable++
在线程中运行上面语句,则JVM可能只会同步一次。
原子改变变量值。
使用sun.misc.Unsafe类。 例如
上面的程序解决了volatile的一个局限性,即volatile声明的变量只能保证load-read或者store-write的原子性,上面的程序保证了load-read和store-write两个动作的原子性