https://www.ibm.com/developerworks/cn/java/j-jtp06197.html
http://www.cnblogs.com/sunrunzhi/p/3930297.html
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;
锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。
互斥即一次只允许一个线程持有某个特定的锁
可见性,必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的
volatile让变量每次在使用的时候,都从主存中取。而不是从各个线程的“工作内存”。
volatile具有synchronized关键字的“可见性”,但是没有synchronized关键字的“并发正确性”,也就是说不保证线程执行的有序性。
也就是说,volatile变量对于每次使用,线程都能得到当前volatile变量的最新值。但是volatile变量并不保证并发的正确性。
volatile是变量修饰符,而synchronized则作用于一段代码或方法
当变量的值由自身的上一个决定时,如n=n+1、n++ 等,volatile关键字将失效,
只有当变量的值和自身上一个值无关时对该变量的操作才是原子级别的,如n = m + 1,这个就是原级别的
所以在使用volatile关键时一定要谨慎,如果自己没有把握,可以使用synchronized来代替volatile。