- 1、本文档共34页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
【讲义】第 讲:并发编程基础知识
⼀、Java内存模型
. 原⼦性(Atomicity)
. 可⻅性(Visibility)
. 有序性(Ordering)
. . 指令重排
. . Happen-Before规则
⼆、多线程基本操作
. 线程状态
. stop(被废弃)
. interruptisInterruptinterrupted
. waitnotify
. suspendresume(被废弃)
. joinyield
三、volatile
四、ThreadGroup
五、Daemon
六、synchronized
七、锁的优化策略
⼋、⽆锁
. CAS
. AtomicInteger
. Unsafe
. AtomicReference
. AtomicStampedReference
. AtomicIntegerArray
. AtomicIntegerFieldUpdater
九、ThreadLocal
1
⼀、Java内存模型
●Java内存模型,即:JMM。当程序执⾏并⾏操作时,如果对数据的访问和操作不加以控制,那么必
然会对程序的正确性造成破坏。因此,我们需要在深⼊了解并⾏机制的前提下,再定义⼀种规则,
来保证多个线程间可以有效地、正确地协同⼯作。⽽JMM就是为此⽽⽣的。
●JMM的关键技术点都是围绕着多线程的原⼦性、可⻅性和有序性来创建的。所以,下⾯我们来⼀⼀
介绍这三种特性。
1.1原⼦性(Atomicity)
●原⼦性
是指⼀个操作是不可中断的。即使是在多个线程⼀起执⾏的时候,⼀个操作⼀旦开始,就不会被其他
线程所⼲扰。
●⽐如⼀个inta,线程A对其赋值1,线程B对其赋值2,⽆论什么情况,a的值要么是1,要么是2;不
会被线程A或线程B⼲扰。但是,如果是在32位操作系统中,操作64位的long类型数据的时候,
就⽆法保证原⼦性了。因为赋值操作需要执⾏2次32位的操作,⽽在多线程的情况下,可能会出
现“意想不到”的最终结果。如下所示:
2
【解释】
由于在32位操作系统中,对long赋值是要执⾏两步的,所以,在并发赋值时,就有可能最终long的赋
值结果“让⼈很意外”,即:不是111L、-999L、333L和-444L中的任意⼀个。(例如:long的⾼32位
由线程A赋值了,低32位由线程B赋值了)
1.2可⻅性(Visibility)
●可⻅性
3
是指当⼀个线程修改了某⼀个共享变量的值,其他线程是否能够⽴即知道这个修改。
●如果在CPU_A和CPU_B上各运⾏了⼀个线程,它们共享变量t,由于编译器优化或者硬件优化的缘
故,在CPU_A上的线程将变量t进⾏了优化,将其缓存在cache中或者寄存器⾥。这种情况下,如果
在CPU_B上的某个线程修改了变量t的实际值,那么CPU_A上的线程可能并⽆法意识到这个改动,
依然会读取cache中或者寄存器⾥的数据。
●可⻅性问题是⼀个综合性问题。除了上述提到的缓存优化或者硬件优化(有些内存读写可能不会⽴
即触发,⽽会先进⼊⼀个硬件队列等待)会导致可⻅性问题外,指令重排以及编译器的优化,
都有可能导致⼀个线程的修改不会⽴即被其他线程察觉。
1.3有序性(Ordering)
●因为指令流⽔线的存在,CPU才能真正⾼效的执⾏。但是,流⽔线总是害怕被中断的。流⽔线满载
时,性能确实相当不错,但是⼀旦中断,所有的硬件设备
文档评论(0)