章节介绍

  这一章节主要学习java并发机制的底层实现原理。主要学习volatile、synchronized和原子操作的实现原理。Java中的大部分容器和框架都依赖于此。

  Java代码 ==经过编译==》Java字节码 ==通过类加载器==》JVM(jvm执行字节码)==转化为汇编指令==》CPU上执行。

  Java中使用的并发机制依赖于JVM的实现和CPU的指令。

volatile初探

  volatile是是轻量级的synchronized,它在多处理器开发中保证了共享变量的可见性。可见性的意思就是 当一个线程修改了一个共享变量时候,另一个线程能够读取到这个值。volatile不会引起上下文的切换和调度。(需要具体理解下。。)

  CPU相关术语说明

  

  

  volatile定义:java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排它锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明为volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。

  volatile是如何保证可见性的呢?(可以通过汇编指令来查看对volatile进行操作时,cpu会做什么事情)

  在对volatile修饰的变量进行写操作时,出现的汇编代码中会加上Lock关键字。Lock前缀的指令在多核处理器中会引发两件事情:(1)将当前处理器缓存行的数据写回到内存;(2)这个写回到内存的操作会使在其他cpu里缓存了该内存地址的数据无效。

  具体操作为:如果对声明了volatile的变量进行写操作时,jvm会向处理器发出一条Lock前缀的指令,将这个变量所在缓存行的数据写回到内存。但是,此时虽然将数据写回到内存,但是其他处理器缓存的数据可能还是旧的,这样的话,再执行计算操作就有问题了。

  所以在多处理下,为了保证各个处理器的缓存是一致的,就会实现缓存的一致性协议,每个处理器通过嗅探总线上传播的数据来检查自己缓存的值是不是过期了。如果,处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器中的缓存行 设置成无效状态。当处理器对这个数据进行修改操作的时候,会重新从系统内存中把数据读到处理器缓存中。

  

volatile的使用优化

  介绍:Java并发编程大师Doug lea 在jdk7的并发包里新增一个队列集合类LinkedTransferQueue,它在使用volatile变量时,采用追加字节的方式优化队列出队和入队的性能。具体可以看下相关类的源码。

  但是,并非有些情况,上述方法是无效的。(1)缓存行非64字节的处理器;(2)共享变量不会被频繁的写。(因为追加字节的方式需要处理器读取更多的字节到高速缓冲区,这本身就带来了一些性能的消耗。如果共享变量不会频繁写的话,锁的几率也非常小,就没必要使用追加字节的方式来避免互相锁定了)。

  还有个问题,这种追加字节的方式在Java 7下可能不生效。

下一章节,学习synchronized,期待.....

【java并发编程艺术学习】(三)第二章 java并发机制的底层实现原理 学习记录(一) volatile的更多相关文章

  1. Android艺术开发探索——第二章:IPC机制(下)

    Android艺术开发探索--第二章:IPC机制(下) 我们继续来讲IPC机制,在本篇中你将会学习到 ContentProvider Socket Binder连接池 一.使用ContentProvi ...

  2. 【java并发编程艺术学习】(五)第二章 java并发机制的底层实现原理 学习记录(三) 原子操作的实现原理学习

    章节介绍 主要包括 术语定义.处理器如何实现原子操作.Java如何实现原子操作: 原子(atomic)本意是 不能再进一步分割的最小粒子,“原子操作” 意为 不可被中断的一个或一系列操作. 术语定义 ...

  3. java并发编程实战笔记---(第二章)线程安全:正确性

    ThreadA__________     同步 ______________ 异步 ___________     异步 ThreadB__________         ____________ ...

  4. 【java并发编程艺术学习】(四)第二章 java并发机制的底层实现原理 学习记录(二) synchronized

    章节介绍 本章节主要学习 Java SE 1.6 中为了减少获得锁 和 释放锁 时带来的性能消耗 而引入的偏向锁 和 轻量级锁,以及锁的存储结构 和 升级过程. synchronized实现同步的基础 ...

  5. 如何评价《Java 并发编程艺术》这本书?

    对于书评这件事情,我其实是不想写的,因为每个人都有自己的一个衡量标准,每个人眼中都有自己的哈姆雷特,是好是坏每个人都褒贬不一.如果对于书中的知识你都掌握了,你只是想把它作为一种知识串联的记忆体的话,那 ...

  6. 程序员编程艺术第三十六~三十七章、搜索智能提示suggestion,附近点搜索

    第三十六~三十七章.搜索智能提示suggestion,附近地点搜索 作者:July.致谢:caopengcs.胡果果.时间:二零一三年九月七日. 题记 写博的近三年,整理了太多太多的笔试面试题,如微软 ...

  7. [书籍翻译] 《JavaScript并发编程》第三章 使用Promises实现同步

    本文是我翻译<JavaScript Concurrency>书籍的第三章 使用Promises实现同步,该书主要以Promises.Generator.Web workers等技术来讲解J ...

  8. java并发编程笔记(三)——线程安全性

    java并发编程笔记(三)--线程安全性 线程安全性: ​ 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现 ...

  9. 【Java并发基础】并发编程领域的三个问题:分工、同步和互斥

    前言 可以将Java并发编程抽象为三个核心问题:分工.同步和互斥. 这三个问题的产生源自对性能的需求.最初时,为提高计算机的效率,当IO在等待时不让CPU空闲,于是就出现了分时操作系统也就出现了并发. ...

随机推荐

  1. java面向对象入门之带参方法创建

    /* Name :创建带参的方法 Power by :Stuart Date:2015.4.25 */ //创建Way类 class Way{ //Way类成员的基本变量 int add1=123; ...

  2. 第10条:尽量用enumerate取代range

    核心要点: (1)enumerate函数提供了一种精简的写法,可以在遍历迭代器时获知每个元素的索引. (2)尽量用enumerate来改写那种将range与下标访问相结合的序列遍历代码. (3)可以给 ...

  3. 请简单介绍一下Spring

    Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. Spring ...

  4. Python基础(4)_字典、集合、bool值

    三.字典 定义:{key1:value1,key2:value2},key-value结构,key必须是不可变类型,或者可hash 基本形式:key:value特性: 1.可存放多个值 2.可修改指定 ...

  5. 扣出thinkphp数据库操作类

    假如你是一位thinkphp的使用者,想必你会觉得thinkphp操作数据库非常方便.现在在你面前有一个非常小的作业,小到完全没有必要用thinkphp去完成它.但是你又觉得不用thinkphp的话, ...

  6. Scala window下安装

    第一步:Java 设置 检测方法前文已说明,这里不再描述. 如果还为安装,可以参考我们的Java 开发环境配置. 接下来,我们可以从 Scala 官网地址 http://www.scala-lang. ...

  7. 每天一个Linux命令(4)touch命令

    touch命令有两个功能:一是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来:二是用来创建新的空文件.     (1)用法 用法:touch [选项]... ...

  8. sublime text的pylinter插件设置pylint_rc后提示错误

    sublime text插件pylinter提示错误 Warning: option include-ids is deprecated and ignored. 错误本身是Python的错误,这说明 ...

  9. 推荐ajaxfilemanager for tiny_mce 比较完善的tiny_mce编辑器的图片上传及图片管理插件PHP版 支持中文

    tiny_mce编辑器,我觉得挺简洁.好用的,但就是图片上传的插件是收费的,而且网上找了半天也没有找到开源好用的上传插件. 不过功夫不负有心人,终于还就被我找到一款相当满意的插件. 这个插件的名字叫a ...

  10. 创建 CSS3 下拉菜单

    1. [图片] 菜单效果 2. [代码]menu.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ...