java多线程——volatile关键字

提及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关键字的做用?

刚也说过volatile关键字对应的可见性,但这是其中之一,它有两个做用:学习

  • 1)使用volatile关键字修饰的变量,保证了其在多线程之间的可见性,即每次读取到volatile变量,必定是最新的数据
  • 2)代码底层执行不像咱们看到的高级语言—-Java程序这么简单,它的执行是Java代码–>字节码–>根据字节码执行对应的C/C++代码–>C/C++代码被编译成汇编语言–>和硬件电路交互,现实中,为了获取更好的性能JVM可能会对指令进行重排序,多线程下可能会出现一些意想不到的问题。使用volatile则会对禁止语义重排序,固然这也必定程度上下降了代码执行效率
相关文章
相关标签/搜索