- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
并发编程的挑战
上下文切换:CPU通过时间片分配算法来循环执行任务,在切换任务的过程中,会保存上一个任务的状态,以便在下次切换回这个任务时,可以再加载这个任务的状态。
减少上下文切换的方法:无锁并发编程、CAS算法、使用最少线程和使用协程
Java并发机制的底层实现原理
Java代码编译后java字节码然后加载到JVM然后转化为CUP执行的汇编,java的并发依赖于JVM的实现与CPU的指令。
Volatile的应用
可见性:当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。
后面还是详细介绍volatile关键字
synchronized的实现原理与应用
synchronized简介
synchronized在JVM中实现,JVM基于进入与退出Monitor对象来实现方法同步与代码块同步,在同步代码块前后分别形成monitorenter和monitorexit这两个字节码。synchronized的锁存放在java对象头里,在对象头里有关于锁的信息:轻量级锁,重量级锁,偏向锁。(对象头里还包括:GC标记、分代年龄、线程ID、HashCode等。)
锁的介绍
级别从低到高:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态,锁能升级不能降级,目的是提高获取锁和释放锁的效率。
偏向锁:
在大多数情况下,锁不仅不存在多线程竞争,而且总是由同一个线程多次获得。
为了让线程获得锁的代价更低而引入了偏向锁。
当一个线程访问同步块并获取锁(对象)时,会在对象头里记录偏向锁的线程ID。以后该线程进入与退出同步块时不需要进行CAS操作来加锁和解锁。如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会尝试消除它身上的偏向锁,将锁恢复到标准的轻量级锁。
轻量级锁:
线程通过CAS来获取锁(线程栈帧中有存储锁记录的空间,将Mask Word复制到锁记录中,然后尝试使用CAS将对象头中的Mask Word替换成指向锁记录的指针),如果成功,就获取锁,失败就尝试自旋来获取锁。
重量级锁:
为了避免在轻量级中无用的自旋(比如获取到锁的线程被阻塞住了),JVM可以将锁升级成重量级。当锁处于这个状态时,其他线程试图获取锁时,都会被阻塞住,当持有锁的线程释放锁之后会唤醒这些线程。
锁
优点
缺点
使用场景
偏向锁
加锁与解锁不需要额外的消耗。
线程存在竞争时,会带来额外的锁撤销的消耗
适用于只有一个线程访问同步块
轻量级锁
竞争的线程不会阻塞,提高了程序的响应速度
始终得不到锁竞争的线程,自旋消耗CPU
追求响应时间,同步块执行速度非常快
重量级锁
线程竞争不使用自旋,不会消耗CPU
线程阻塞,响应时间缓慢
追求吞吐量,同步块执行时间较长
原子操作的实现原理
原子:不能被中断的一个或一系列操作。
在java中可以通过锁和循环CAS的方式来实现原子操作。
使用循环CAS实现原子操作
利用处理器提供的CAS指令来实现,自旋CAS现在的基本思路就是循环进行CAS操作直达成功为止。
CAS实现原子操作的三大问题:
ABA问题:如果一个值原来是A后来变成了B,然后又变成了A。那么使用CAS时进行检查的时候,该值实际上发送了变化。解决:加入版本号,如:1A-2B-3A
循环时间长开销大:自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销。
只能保证一个共享变量的原子操作。CAS不能对多个共享变量进行。JDK1.5,提供的AtomicReference类可以保证引用对象之间的原子性,可以将多个变量放在一个对象中进行。
使用锁机制实现原子操作
锁机制保证了只有获取到锁的线程才能操作锁定的内存区域。
Java内存模型
Java内存模型的基础
并发编程模型的两个关键问题:线程之间的通信与同步。
在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。
在共享内存的并发模型中,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信,在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来进行显示通信。
同步是指程序中用于控制不同线程间操作发生相对顺序的机制。在共享内存模型下,同步是显示进行,程序员必须显示指定某个方法或某段代码需要在线程之间互斥执行。在消息传递的并发模型里,由于消息的发送必须在消息接收之前,因此同步是隐式进行的。
Java的并发采用的是共享内存模型,java线程之间的通信总是隐式的进行,整个通信过程对程序员透明。
Java内存模型的抽象结构
Java内存模型规定所有的变量都是存在主存当中,每个线程都有自己的工作内存。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。
从源代码到指令序列的重排序
源代码-编译期优化重排序-指令级并行
您可能关注的文档
- Cloning高二英语课件.ppt
- co2与一氧化碳.ppt
- Characteristics of Ore-forming Fluid of the Gaoshan Gold-Silver Deposit龙泉高山金银矿床流体—江彪.pdf
- CloudCC通用解决方案-精髓版20.ppt
- CMC数学竞赛专题2一元函数微分学.doc
- Canada名人简介(英文版).ppt
- CNAS-GL05《实验室内部研制质量控制样品的指南》.pdf
- CONCEPT 80 简单操作说明.pdf
- console方法属性大全.pdf
- CSS语义化标准.pdf
- 金融产品2024年投资策略报告:积极适应市场风格,行为金融+机器学习新发现.pdf
- 交运物流2024年度投资策略:转型十字路,峰回路又转(2023120317).pdf
- 建材行业2024年投资策略报告:板块持续磨底,重点关注需求侧复苏.pdf
- 宏观2024年投资策略报告:复苏之路.pdf
- 光储氢2024年投资策略报告:复苏在春季,需求的非线性增长曙光初现.pdf
- 公用环保2024年投资策略报告:电改持续推进,火电盈利稳定性有望进一步提升.pdf
- 房地产2024年投资策略报告:聚焦三大工程,静待需求修复.pdf
- 保险2024年投资策略报告:资产负债匹配穿越利率周期.pdf
- 政策研究2024年宏观政策与经济形势展望:共识与分歧.pdf
- 有色金属行业2024年投资策略报告:新旧需求共振&工业原料受限,构筑有色大海星辰.pdf
文档评论(0)