网站大量收购独家精品文档,联系QQ:2885784924

java并发编程艺术总结.docx

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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内存模型规定所有的变量都是存在主存当中,每个线程都有自己的工作内存。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。 从源代码到指令序列的重排序 源代码-编译期优化重排序-指令级并行

文档评论(0)

a888118a + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档