资讯专栏INFORMATION COLUMN

java多线程——volatile关键字

W_BinaryTree / 1088人阅读

摘要:多线程主要就是围绕可见性和原子性这两个特性展开的,关键字对应着可见性,但很多时候人们误以为使用了关键字后编写多线程就没问题了,不知道它不能保证原子性。

说起volatile和sychronized这两个关键字,学习过多线程的同学应该都很熟悉,在jdk1.5之前,主要就是靠这两个关键字来做多线程编程的,但在jdk1.5以后,多了一个java.util.concurrent(JUC)包,里面包含了很多工具类用于多线程编程。但今天的重点还是讲讲volatile关键字。

多线程主要就是围绕可见性和原子性这两个特性展开的,volatile关键字对应着可见性,但很多时候人们误以为使用了volatile关键字后编写多线程就没问题了,不知道它不能保证原子性。

首先来说说什么是可见性?

要说到可见性,就得扯到java内存模型了,暂且不做太多展开,简单理解下就是,现在技术的提升,使得cpu的核心数不断增多,而每个核心又拥有自己的缓存,当处理数据时会有以下几个步骤:

将数据从内存读取到缓存中

在缓存中对数据进行操作

将缓存中的数据写入内存中

步骤2中的操作并不是原子性,也就是在步骤1之后,如果主内存变量发生修改之后,线程工作内存中的值由于已经加载,不会产生对应的变化,所以计算出来的结果会和预期不一样

对于volatile修饰的变量,jvm虚拟机只是保证从主内存加载到线程工作内存的值是最新的

正是因为这几个步骤的存在,往往别的核心从内存中读取到的数据不是最新的,这就造成了数据错误。java为了屏蔽操作系统以及硬件之间的不同,在jvm中虚拟出了一套内存模型,编码时使用volatile关键字对需要实时可见的数据修饰,在jvm底层会对该变量做特定的处理。

总结下可见性就是当多个线程操作共享数据时,保证操作的数据是最新的。

volatile关键字的作用?

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

1)使用volatile关键字修饰的变量,保证了其在多线程之间的可见性,即每次读取到volatile变量,一定是最新的数据

2)代码底层执行不像我们看到的高级语言—-Java程序这么简单,它的执行是Java代码–>字节码–>根据字节码执行对应的C/C++代码–>C/C++代码被编译成汇编语言–>和硬件电路交互,现实中,为了获取更好的性能JVM可能会对指令进行重排序,多线程下可能会出现一些意想不到的问题。使用volatile则会对禁止语义重排序,当然这也一定程度上降低了代码执行效率

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67732.html

相关文章

  • Java线程学习(三)volatile键字

    摘要:三关键字能保证原子性吗并发编程艺术这本书上说保证但是在自增操作非原子操作上不保证,多线程编程核心艺术这本书说不保证。多线程访问关键字不会发生阻塞,而关键字可能会发生阻塞关键字能保证数据的可见性,但不能保证数据的原子性。 系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchroniz...

    tain335 评论0 收藏0
  • JAVA线程机制解析-volatile&synchronized

    摘要:当一个线程持有重量级锁时,另外一个线程就会被直接踢到同步队列中等待。 java代码先编译成字节码,字节码最后编译成cpu指令,因此Java的多线程实现最终依赖于jvm和cpu的实现 synchronized和volatile 我们先来讨论一下volatile关键字的作用以及实现机制,每个线程看到的用volatile修饰的变量的值都是最新的,更深入的解释就涉及到Java的内存模型了,我们...

    dendoink 评论0 收藏0
  • Java 线程(6):volatile 键字的使用

    摘要:所以多线程条件下使用关键字的前提是对变量的写操作不依赖于变量的当前值,而赋值操作很明显满足这一前提。在多线程环境下,正确使用关键字可以比直接使用更加高效而且代码简洁,但是使用关键字也更容易出错。 volatile 作为 Java 语言的一个关键字,被看作是轻量级的 synchronized(锁)。虽然 volatile 只具有synchronized 的部分功能,但是一般使用 vola...

    paulquei 评论0 收藏0
  • 线程学习笔记(1):volatile和synchronized

    摘要:今天开始整理学习多线程的知识,谈谈最重要的两个关键字和。但是这样一个过程比较慢,在使用多线程的时候就会出现问题。有序性有序性是指多线程执行结果的正确性。这种机制在多线程中会出现问题,因此可以通过来禁止重排。 今天开始整理学习多线程的知识,谈谈最重要的两个关键字:volatile和synchronized。 一、三个特性 1、原子性 所谓原子性操作就是指这些操作是不可中断的,要么执行过程...

    jk_v1 评论0 收藏0
  • 慕课网_《细说Java线程之内存可见性》学习总结

    时间:2017年07月09日星期日说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://github.com/zccodere/s... 第一章:课程简介 1-1 课程简介 课程目标和学习内容 共享变量在线程间的可见性 synchronized实现可见性 volatile实现可见性 指令重排序 as-if-seria...

    wupengyu 评论0 收藏0

发表评论

0条评论

W_BinaryTree

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<