那些年读过的书《Java并发编程的艺术》一、并发编程的挑战和并发机制的底层实现原理
一、并发编程的挑战
1、上下文切换
(1)上下文切换的问题
在处理器上提供了强大的并行性就使得程序的并发成为了可能。处理器通过给不同的线程分配不同的时间片以实现线程执行的自动调度和切换,实现了程序并行的假象。
在单线程中:线程保存串行的执行,线程间的上下文切换不会造成很大的性能开销。
而在多线程中:线程之间频繁的调度需要进行上下文切换以保存当前执行线程的上下文信息和加载将要执行线程的上下文信息,而上下文切换时需要底层处理器、操作系统、Java虚拟机提供支持的会消耗很多的性能开
销。如果频繁的进行上下文切换势必影响程序执行的速度。
(2)如何查看上下文切换的开销
1)使用性能分析工具Lmbench3测量上下文切换的时长
2)使用vmstat测量上下文切换的次数
3)使用jstack命令查看线程的dump信息
(3)如何减少上下文切换
1)无锁并发编程:多线程竞争锁时会引起上下文切换,使用无锁编程通过避免使用锁来减少上下文切换
2)CAS算法:使用Java内Automic的原子类的CAS操作
3)减少线程数量:线程越少,上下文切换的次数就越少
4)单线程:在单线程内实现任务的调度和执行
2、死锁
(1)如何避免死锁
3、资源限制的挑战
(1)硬件资源的限制和处理办法
硬件资源限制有带宽的上传下载速度、硬盘的读写速度、CPU的处理速度
处理办法:集群化
(2)软件资源的限制和处理办法
软件资源限制有数据库的连接数,socket的连接数.
处理办法:共享软件资源即软件资源的复用
二、并发机制的底层实现原理
1、volatile与synchronized实现原理和区别
1)volatile和synchronized的区别
关键字
功能特性
实现原理
优点
缺点
适用范围
说明
volatile 1、实现变量的内存可见性
2、禁止指令的重排序
3、JVM内置的属性由内存屏障指令防止重排序和缓存一致性嗅探技术实现内存可见性 1、确保内存的可见性
2、不会引起线程上下文切换和调度1、仅仅保证单个volatile变量的读写操作的原子性,不能保证复合操作的原子性 1、只有单个线程更新变量的值
2、该变量不会与其他变量存在依赖(也就是不一起构成实例对象的不变性)
3、访问变量的时候不需要加锁
三个条件同时满足的时候才可使用。1、volatile写操作的开销比volatile读操作多。 synchronized 1、实现内存的可见性
2、确保操作的互斥性和原子性
3、禁止指令的重排序
4、JVM内置的属性加锁机制 1、确保内存的可见性
2、确保所包含区域操作的原子性1、在严重的线程竞争的时候性能开销大
2、加锁机制会引起线程上下文切换和调度任何需要同步机制的地方都可以使用 1、synchronize的读写操作开销一样
2)内存屏障:限制内存操作顺序的指令
内存屏障指令LOCK:禁止重排序,使用缓存锁定或者主内存锁定来确保处理器缓存(线程的工作内存)的数据会写到主内存当中。
应用:
volatile变量写的时候,编译器会在该代码编译后的指令后面加上一条LOCK指令,以禁止重排序
3)嗅探技术:实现缓冲一致性协议
基于缓存的一致性协议,嗅探技术确保各个处理器的缓存和主内存之间数据保存一致。各个处理器通过嗅探技术监听总线的传播的数据来检测自己缓存的数据是否失效。处理器对于失效的数据需要从主内存内重新加载到处理器的缓存内。
4)锁的类型和状态
锁的状态
作用
说明
无锁状态 锁状态的初始值 偏向锁状态 线程获取的时候,设置对象头Mark Work内的偏向线程ID为当前线程的ID 默认启用,降低锁获取的代价 轻量级锁状态 当对象头Mark Work 内偏向线程ID不为当前线程ID设置为当前线程ID时 重量级锁状态 存在多个线程竞争的时候,轻量级锁状态 晋升为 重量级锁状态
锁的类型
优点
缺点
适用范围
偏向锁 加锁、解锁不需要额外的消耗 线程竞争的时候存在额外的锁撤销消耗 只有一个线程访问同步块的场景 轻量级锁 竞争线程不会阻塞,提高程序的响应速度 获取不到锁的线程自旋等待消耗CPU 追求响应时间
同步块代码执行速度快重量级锁 线程竞争阻塞,不自旋消耗CPU 线程阻塞,响应时间慢 最求吞吐量
同步块代码执行速度较长
2、原子操作的实现原理
所谓的原子操作就是不可分割的最小单位的执行操作
(1)处理器如何实现原子操作
1)总线锁定
2)缓存锁定
(2)Java如何实现原子操作
1)CAS算法
2)加锁机制
三、Java并发类款图(J.U.C)
那些年读过的书《Java并发编程的艺术》一、并发编程的挑战和并发机制的底层实现原理的更多相关文章
- 【java并发编程艺术学习】(三)第二章 java并发机制的底层实现原理 学习记录(一) volatile
章节介绍 这一章节主要学习java并发机制的底层实现原理.主要学习volatile.synchronized和原子操作的实现原理.Java中的大部分容器和框架都依赖于此. Java代码 ==经过编译= ...
- Java 并发系列之二:java 并发机制的底层实现原理
1. 处理器实现原子操作 2. volatile /** 补充: 主要作用:内存可见性,是变量在多个线程中可见,修饰变量,解决一写多读的问题. 轻量级的synchronized,不会造成阻塞.性能比s ...
- Java并发机制的底层实现原理之volatile应用,初学者误看!
volatile的介绍: Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现 ...
- 《Java并发编程的艺术》Java并发机制的底层实现原理(二)
Java并发机制的底层实现原理 1.volatile volatile相当于轻量级的synchronized,在并发编程中保证数据的可见性,使用 valotile 修饰的变量,其内存模型会增加一个 L ...
- 《Java并发编程的艺术》读书笔记:一、并发编程的目的与挑战
发现自己有很多读书笔记了,但是一直都是自己闷头背,没有输出,突然想起还有博客圆这么个好平台给我留着位置,可不能荒废了. 此文读的书是<Jvava并发编程的艺术>,方腾飞等著,非常经典的一本 ...
- 并发艺术--java并发机制的底层实现原理
前言 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令. 一 ...
- 《Java并发编程的艺术》读书笔记:二、Java并发机制的底层实现原理
二.Java并发机制底层实现原理 这里是我的<Java并发编程的艺术>读书笔记的第二篇,对前文有兴趣的朋友可以去这里看第一篇:一.并发编程的目的与挑战 有兴趣讨论的朋友可以给我留言! 1. ...
- (第二章)Java并发机制的底层实现原理
一.概述 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令. ...
- Java并发机制和底层实现原理
Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码转化为汇编指令在CPU上执行.Java中的并发机制依赖于JVM的实现和CPU的指令. Java语言规范第三版中 ...
随机推荐
- Go Revel - Logging(日志)
revel提供了4种日志记录器: 1.`TRACE` - 调试信息 2.`INFO` - 信息 3.`WARN` - 一些无害的异常信息 4.`ERROR` - 必须要关注的错误 日志记录器可以在`a ...
- Java知多少(29)覆盖和重载
在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类 ...
- Json Web Token(JWT)
Json web token (JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(Si ...
- AndroidStudio 代码(导入类)报错但可正常运行,以及解决此问题后带来的系列问题解决
首先是应用中很多导入的类都报红色异常显示找不到此类,但运行编译正常: 第一种方法: 点击AndroidStudio菜单File -> Invalidate Caches/Restar… ,在弹出 ...
- linux 修改文件类型
:Unix及类Unix系统里,每行结尾只有换行“\n”,Windows系统里面,每行结尾是换行+回车“\n\r”. 利用Linux下的vim编辑器,可以方便的在dos文件.unix文件之间进行切换,且 ...
- AbtestingGateway 分流策略添加
目录结构分布 我们从GitHub上把它下载后解压出来,有以下5个目录,分别是: admin 管理模块,对策略增删改查等功能 diversion 主模块吧,看源码是匹配redis存储的key doc 文 ...
- [hadoop] hadoop native libraries 编译
安装hadoop启动之后总有警告:Unable to load native-hadoop library for your platform... using builtin-Javaclasses ...
- [Converge] Gradient Descent - Several solvers
solver : {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’}, default: ‘liblinear’ Algorithm to use in the op ...
- [JS] ECMAScript 6 - Variable : compare with c#
前言 范围包括:ECMAScript 新功能以及对象. 当前的主要目的就是,JS的学习 --> ECMAScript 6 入门 let 命令 js 因为let, i的范围限制在了循环中. var ...
- 实验一:基于STM32F1的流水灯实验(库函数)
参考原子哥学习程序 条件:实验板STM32103ZET6:固件库STM32F10x_StdPeriph_Lib_V3.5.0:环境MDK5: 目的:了解STM32 的 IO 口如何作为输出使用 :以两 ...
