volatile是Java提供的轻量级的同步机制,比sync的开销要小
被volatile定义的变量,系统每次用到它时都是直接从主存中读取,而不是各个线程的工作内存
volatile可以像sync一样保持变量在多线程环境中是实时可见的
可见性:
每个线程都有自己的工作内存,每次线程执行时,会从主存获得变量的拷贝,对变量的操作是在线程的工作内存中进行,不同的线程之间不共享工作内存;对于volatile(sync,final)来说,打破了上述的规则,当线程修改了变量的值,其他线程可以立即知道该变量的改变。而对于普通变量,当一个线程修改了变量,需要将变量写回主存,其他线程从主存中读取变量后才对该线程可见
volatile具有sync的可见性,但是不具备原子性(解决java多线程的执行有序性)。volatile适用于多个变量之间或者某个变量当前值和修改之后值之间没有约束。因此,单独使用volatile还不足以实现计数器,互斥锁等