【java并发编程艺术学习】(三)第二章 java并发机制的底层实现原理 学习记录(一) volatile
章节介绍
这一章节主要学习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的更多相关文章
- Android艺术开发探索——第二章:IPC机制(下)
Android艺术开发探索--第二章:IPC机制(下) 我们继续来讲IPC机制,在本篇中你将会学习到 ContentProvider Socket Binder连接池 一.使用ContentProvi ...
- 【java并发编程艺术学习】(五)第二章 java并发机制的底层实现原理 学习记录(三) 原子操作的实现原理学习
章节介绍 主要包括 术语定义.处理器如何实现原子操作.Java如何实现原子操作: 原子(atomic)本意是 不能再进一步分割的最小粒子,“原子操作” 意为 不可被中断的一个或一系列操作. 术语定义 ...
- java并发编程实战笔记---(第二章)线程安全:正确性
ThreadA__________ 同步 ______________ 异步 ___________ 异步 ThreadB__________ ____________ ...
- 【java并发编程艺术学习】(四)第二章 java并发机制的底层实现原理 学习记录(二) synchronized
章节介绍 本章节主要学习 Java SE 1.6 中为了减少获得锁 和 释放锁 时带来的性能消耗 而引入的偏向锁 和 轻量级锁,以及锁的存储结构 和 升级过程. synchronized实现同步的基础 ...
- 如何评价《Java 并发编程艺术》这本书?
对于书评这件事情,我其实是不想写的,因为每个人都有自己的一个衡量标准,每个人眼中都有自己的哈姆雷特,是好是坏每个人都褒贬不一.如果对于书中的知识你都掌握了,你只是想把它作为一种知识串联的记忆体的话,那 ...
- 程序员编程艺术第三十六~三十七章、搜索智能提示suggestion,附近点搜索
第三十六~三十七章.搜索智能提示suggestion,附近地点搜索 作者:July.致谢:caopengcs.胡果果.时间:二零一三年九月七日. 题记 写博的近三年,整理了太多太多的笔试面试题,如微软 ...
- [书籍翻译] 《JavaScript并发编程》第三章 使用Promises实现同步
本文是我翻译<JavaScript Concurrency>书籍的第三章 使用Promises实现同步,该书主要以Promises.Generator.Web workers等技术来讲解J ...
- java并发编程笔记(三)——线程安全性
java并发编程笔记(三)--线程安全性 线程安全性: 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现 ...
- 【Java并发基础】并发编程领域的三个问题:分工、同步和互斥
前言 可以将Java并发编程抽象为三个核心问题:分工.同步和互斥. 这三个问题的产生源自对性能的需求.最初时,为提高计算机的效率,当IO在等待时不让CPU空闲,于是就出现了分时操作系统也就出现了并发. ...
随机推荐
- MD_STOCK_REQUIREMENTS_LIST_API 取MD04的MRP Element
[转http://lz357502668.blog.163.com/blog/static/16496743201231941718527/]?MD_STOCK_REQUIREMENTS_LIST_A ...
- IoC与DI
IoC与DI 首先想说说IoC(Inversion of Control,控制倒转).这是spring的核心,贯穿始终.所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期 ...
- WebApp页面开发小结
一 背景 公司需要开发一个web页面,需要支持主流android和ios手机,采用web页面好处是一个页面,在不同平台之间都可以用,节省成本,基本html.js和css大家也都熟悉.但是对 ...
- iOS项目中获取验证码倒计时及闪烁问题解决方案
-(void)startTime{ __block int timeout= 59; //倒计时时间 dispatch_queue_t queue = dispatch_get_global_queu ...
- 0420模块 序列化模块 hashlib模块
复习:内置方法 __len__ len(obj)的结果依赖于obj.__len__()的结果,计算对象的长度__hash__ hash(obj)的结果依赖于obj.__hash__()的结果,计算对象 ...
- UI控件概述
常见UI控件 UIKit框架提供了非常多功能强大又易用的UI控件,以便于开发者打造出各式各样的App 以下列举一些在开发中常见的UI控件(稍后补上图片示例) 1.UILabel– 文本标签:作用是显示 ...
- find查找文件
linux下最强大的搜索命令为”find“. 它的格式为”find <指定目录> <指定条件> <指定动作>“: 比如使用find命令搜索在根目录下的所有inter ...
- EntityFramework 学习 一 Entity Framework 查询设计
First/FirstOrDefault: using (var ctx = new SchoolDBEntities()) { var student = (from s in ctx.Studen ...
- html符号实体
对网页设计,软考有用的字符实体
- java学习进度条四