Java并发编程.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java并发编程

Java并发编程  快么?  这个问题肯定是错的,并发比串行慢的原因在于:线程有创建和上下文切换的开销  上下文切换  即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。CPU通过时间片分配的算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保持上一个任务的状态,以便下次切换回这个任务时,可以再加之这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。  如何减少上下文切换  无锁并发编程:多线程竞争锁,会引起上下文切换,所以多线程处理数据时,可以用一些办法避免使用锁,如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据  CAS算法:Java的Atomic包使用CAS算法来更新数据,而不需要加锁。  使用最少线程:避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程处于等待  协程:在单行线程中实现多任务调度,并在单线程中维持多个任务的切换  避免死锁的几种方式  避免一个线程同时获取多个锁  避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源  尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。  对于数据库锁,加锁和解锁必须在一个数据库连接中里,否则会出现解锁失败的情况。  资源限制  资源限制指的是程序的执行速度受限于计算机硬件资源或软件资源,如服务器的带宽只有2Mb/s,某个资源的下载速度为1Mb/s,系统启动10个线程去下载资源,下载速度不会变成10Mb/s,所以在进行并发的时候回考虑资源的限制。硬件资源限制有带宽的上传/下载速度、硬盘的读写速度和CPU的处理速度。软件资源限制有数据库的连接数和socket连接数等。  资源限制引来的问题:为了将代码执行速度加快将代码中串行执行的部分变成并发执行,因为资源受限,仍然在串行执行,这时候程序不仅不会加快,反而会变慢,因为增加了上下文切换和资源调度的时间。  如何解决资源限制问题:可以使用集群并行执行程序,既然单机的资源有限,那么可以让程序在多机上运行,比如使用ODPS、Hadoop或者自己搭个服务器集群,不同的机器处理不同的数据,可以通过“数据ID%机器数”,计算得到一个机器编号,然后由对应编号的机器处理这个数据,对于软件资源受限,可以使用资源池来复用如使用连接池将数据库和Socket连接复用,或者在调用对方webservice接口获取数据只建立一个连接。  Java并发机制的底层实现原理  Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java所使用的并发机制依赖于JVM的实现和CPU的指令  volatile的应用  volatile是轻量级的synchronized,在多处理器并发中保证了共享变量的可见性,可见性是指当一个线程修改了一个共享变量,另一个线程能读到修改的值,它不会引起线程上下文切换和调度  volatile在java代码转换为汇编代码 会多了一个Lock前缀的指令,在多核处理器下发生两件事情  将当前处理器缓存行的数据写回到系统内存  将这个协会内存的操作会使得其他CPU力缓存了该内存的地址的数据无效  为了提高处理速度,处理器不直接和内存通信,而是将系统内存的数据读到内部缓存(L1,L2或其他)后再进行操作,但操作完不知道何时回写到内存,如果声明了volatile的变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存,但是就是写会内存,如果其他处理器缓存的值还是旧的,再执行计算操作就会有问题,所以在多处理器下为了保证各个处理器的缓存是一致,就会执行缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己的缓存值是否过期,当处理器发现自己缓存行所对应的内存地址被修改,就会将当前处理器缓存行设置为无效,当处理器对数据进行修改操作,会重新从系统内存读到处理器缓存中  synchronized的和应用  javase1.6 对synchronized进行各种优化,过去被人称为重量级锁。  java每个对象都是锁  对于普通同步方法,锁就是实例对象  对于静态同步方法,锁就是当前类的Class对象  对于同步代码块,锁就是Synchonized括号里配置的对象  JVM基于进入和退出Monitor对象来实现方法同步和代码块同步  synchronized用的锁是存在Java对象头里的。Java对象头里的Mark Word力默认储存对象的HashCode,分代年龄和锁标记位。在运行期间,MarkWord储存的数据会随着锁标记位的变化而变化  Javase1

文档评论(0)

rovend + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档