java并发编程艺术学习第二章java并发机制的底层实现原理学习记录volatile

正则吃饺子      2022-04-15     328

关键词:

章节介绍

  这一章节主要学习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并发机制底层原理

二、Java并发机制底层原理volatilesynchronized原子操作2.1volatile原理与应用2.1.1特点轻量级的synchronized共享变量的“可见性”(定义):如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的不会引... 查看详情

[并发编程的艺术]02-java并发机制的底层实现原理

...节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令.一、volatile的应用  在多处理器开发中保证共享变量的"可见性",可见性的意思是:当一个线程修改一个共享变量时,另外一个线程能够... 查看详情

《java并发编程的艺术》学习小结

java并发编程的艺术第一章并发编程的挑战上下文切换:cpu通过时间片让不同线程轮流运行,从线程状态保存到下一次线程运行这个过程就是一次上下文切换多线程并不一定比单线程快,因为多线程会有线程创建和上... 查看详情

《java并发编程的艺术》学习小结

java并发编程的艺术第一章并发编程的挑战上下文切换:cpu通过时间片让不同线程轮流运行,从线程状态保存到下一次线程运行这个过程就是一次上下文切换多线程并不一定比单线程快,因为多线程会有线程创建和上... 查看详情

《java并发编程的艺术》epub下载在线阅读,求百度网盘云资源

《Java并发编程的艺术》(方腾飞)电子书网盘下载免费在线阅读资源链接:链接:https://pan.baidu.com/s/19JrldXCS7yGVJadthE2VNw提取码:1dub  书名:Java并发编程的艺术作者:方腾飞豆瓣评分:7.4出版社:机械工业出版社出版年份... 查看详情

并发编程艺术-锁类型以及底层原理(代码片段)

Java并发编程艺术-并发机制的底层原理实现1.Volatile定义:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。volatile借助Java内存模型保证所有线程能够看到... 查看详情

深入理解java多线程-java并发编程的艺术

今天深度学习一下《Java并发编程的艺术》的第1章并发编程的挑战,深入理解Java多线程,看看多线程中的坑。注意,哈肯的程序员读书笔记并不是抄书,而是将书中精华内容和哈肯的开发经验相结合,给你系统地讲述我对相关知... 查看详情

《java并发编程的艺术》读后笔记-part4(代码片段)

文章目录《Java并发编程的艺术》读后笔记-part4第四章Java并发编程基础1.线程简介1.1什么是线程?1.2为什么要使用多线程?1.3线程优先级1.4线程的状态1.5Daemon线程2.启动和终止线程2.1构造线程2.2启动线程2.3理解中断3.线程间... 查看详情

java并发编程的艺术目录

第7章:JAVA中的13个原子操作类第8章:JAVA中的并发工具类第9章:JAVA中的线程池 查看详情

java并发编程的艺术记录

模拟死锁packagecom.gjjun.concurrent;/***模拟死锁,来源于《Java并发编程的艺术》*@Authorgjjun*@Create2018/8/12**/publicclassDeadLockDemo{privatestaticStringA="A";privatestaticStringB="B";publicstaticvoidmain(String[]args){D 查看详情

并发编程的挑战(java并发编程的艺术)

1.上下文切换CPU通过给每个线程分配CPU时间片来实现并发,切换过程中线程的信息从保存到再加载就是一个上下文切换。由于频繁的进行上下文切换,会消耗资源,所以并发不一定比串行快。可以通过Lmbench3测量上下文切换的时... 查看详情

java并发编程学习笔记

Java编程思想,并发编程学习笔记.一.基本的线程机制 1.定义任务:Runnable接口 线程可以驱动任务,因此需要一种描述任务的方式,这可以由Runnable接口来提供.要想定义任务,只需实现Runnable接口并编写run方法,使得该任务可以执行... 查看详情

《java并发编程的艺术》读后笔记-part1(代码片段)

文章目录《Java并发编程的艺术》读后笔记-part1第一章并发编程的挑战1.上下文切换1.1多线程就一定快吗?1.2如何减少上下文切换呢?2.死锁2.1避免死锁的几个方法3.资源限制的挑战《Java并发编程的艺术》读后笔记-part1第一... 查看详情

java并发编程

Java并发编程(一)之前看《ThinkingInJava》时,并发讲解的挺多的,自己算是初步了解了并发。但是其讲解的不深入,自己感觉其讲解的不够好。后来自己想再学一学并发,买了《Java并发编程实战》,看了一下讲的好基础、好多的理... 查看详情

java并发编程的艺术(5-10)学习总结(代码片段)

本文参考学习Java并发编程的艺术第5章Java中的锁5.1Lock接口synchronized没有的特性尝试非阻塞获取锁能够中断获取锁超时获取锁5.2队列同步器队列同步器AbstractQueuedSynchronizer用来构建锁,或者其它同步组件。用一个int成员变量表... 查看详情

java并发编程艺术系列-一并发编程问题与解决

一、并发编程问题与解决上下文切换死锁资源限制1.1上下文切换1.1.1问题CPU通过时间片分配算法来循环执行任务,当前任务一个时间片执行完后会切换到下一个任务,要保存上一个任务的状态,有一定的开销多线程不一定快-因为... 查看详情

java并发编程的艺术,解读并发编程的优缺点(代码片段)

并发编程的优缺点使用并发的原因多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升。在特殊的业务场景下先天的就适合于并发编程。比如在图像处理领域,一... 查看详情

java并发编程的艺术,解读并发编程的优缺点(代码片段)

并发编程的优缺点使用并发的原因多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升。在特殊的业务场景下先天的就适合于并发编程。比如在图像处理领域,一... 查看详情