提及volatile和sychronized这两个关键字,学习过多线程的同窗应该都很熟悉,在jdk1.5以前,主要就是靠这两个关键字来作多线程编程的,但在jdk1.5之后,多了一个java.util.concurrent(JUC)包,里面包含了不少工具类用于多线程编程。但今天的重点仍是讲讲volatile关键字。java
多线程主要就是围绕可见性和原子性这两个特性展开的,volatile关键字对应着可见性,但不少时候人们误觉得使用了volatile关键字后编写多线程就没问题了,不知道它不能保证原子性。编程
要说到可见性,就得扯到java内存模型了,暂且不作太多展开,简单理解下就是,如今技术的提高,使得cpu的核心数不断增多,而每一个核心又拥有本身的缓存,当处理数据时会有如下几个步骤:缓存
步骤2中的操做并非原子性,也就是在步骤1以后,若是主内存变量发生修改以后,线程工做内存中的值因为已经加载,不会产生对应的变化,因此计算出来的结果会和预期不同多线程
对于volatile修饰的变量,jvm虚拟机只是保证从主内存加载到线程工做内存的值是最新的jvm
正是由于这几个步骤的存在,每每别的核心从内存中读取到的数据不是最新的,这就形成了数据错误。java为了屏蔽操做系统以及硬件之间的不一样,在jvm中虚拟出了一套内存模型,编码时使用volatile关键字对须要实时可见的数据修饰,在jvm底层会对该变量作特定的处理。工具
总结下可见性就是当多个线程操做共享数据时,保证操做的数据是最新的。性能
刚也说过volatile关键字对应的可见性,但这是其中之一,它有两个做用:学习