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

[北京北大青鸟]Java并发编程的总结与思考.docxVIP

[北京北大青鸟]Java并发编程的总结与思考.docx

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

[北大青鸟佳音旗舰校区]Java并发编程的总结与思考编写优质的并发代码是一件难度极高的事情。Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的,但是当我们对并发编程有了更深刻的认识和更多的实践后,实现并发编程就有了更多的方案和更好的选择。本文是北大青鸟佳音旗舰总校对并发编程的一点总结和思考,同时也分享了Java 5以后的版本中如何编写并发代码的一点点经验。【查看详情】为什么需要并发?并发其实是一种解耦合的策略,它帮助我们把做什么(目标)和什么时候做(时机)分开。这样做可以明显改进应用程序的吞吐量(获得更多的CPU调度时间)和结构(程序有多个部分在协同工作)。做过Java Web开发的人都知道,Java Web中的Servlet程序在Servlet容器的支持下采用单实例多线程的工作模式,Servlet容器帮助你处理了并发请求的问题。误解和正解最常见的对并发编程的误解有以下这些:A. 并发总能改进性能。(真相:并发在CPU有很多空闲时间时能明显改进程序的性能,但当线程数量较多的时候,线程间频繁的调度切换反而会让系统的性能下降)B. 编写并发程序无需修改原有的设计。(真相:目的与时机的解耦往往会对系统结构产生巨大的影响)C. 在使用Web或EJB容器时不用关注并发问题。(真相:只有了解了容器在做什么,才能更好的使用容器)下面的这些说法才是对并发编程比较客观的认识:A. 编写并发程序会在代码上增加额外的开销。B. 正确的并发是非常复杂的,即使对于很简单的问题。C. 并发中的缺陷因为不易重现也不容易被发现。D. 并发往往需要对设计策略从根本上进行修改。并发编程的原则和技巧【查看详情】1. 单一职责原则:分离并发相关代码和其他代码(并发相关代码有自己的开发、修改和调优生命周期)。2. 限制数据作用域:两个线程修改共享对象的同一字段时可能会相互干扰,导致不可预期的行为,解决方案之一是构造临界区,但是必须限制临界区的数量。 3. 使用数据副本:数据副本是避免共享数据的好方法,复制出来的对象只是以只读的方式对待。Java 5的java.util.concurrent包中增加一个名为CopyOnWriteArrayList的类,它是List接口的子类型,所以你可以认为它是ArrayList的线程安全的版本,它使用了写时复制的方式创建数据副本进行操作来避免对共享数据并发访问而引发的问题。4. 线程应尽可能独立:让线程存在于自己的世界中,不与其他线程共享数据。有过Java Web开发经验的人都知道,Servlet就是以单实例多线程的方式工作,和每个请求相关的数据都是通过Servlet子类的service方法(或者是doGet或doPost方法)的参数传入的。只要Servlet中的代码只使用局部变量,Servlet就不会导致同步问题。Spring MVC的控制器也是这么做的,从请求中获得的对象都是以方法的参数传入而不是作为类的成员,很明显Struts 2的做法就正好相反,因此Struts 2中作为控制器的Action类都是每个请求对应一个实例。【查看详情】Java 5以前的并发编程Java的线程模型建立在抢占式线程调度的基础上,也就是说:1. 所有线程可以很容易的共享同一进程中的对象。2. 能够引用这些对象的任何线程都可以修改这些对象。3. 为了保护数据,对象可以被锁住。Java基于线程和锁的并发过于底层,而且使用锁很多时候都是很万恶的,因为它相当于让所有的并发都变成了排队等待。在Java 5以前,可以用synchronized关键字来实现锁的功能,它可以用在代码块和方法上,表示在执行整个代码块或方法之前线程必须取得合适的锁。对于类的非静态方法(成员方法)而言,这意味这要取得对象实例的锁,对于类的静态方法(类方法)而言,要取得类的Class对象的锁,对于同步代码块,程序员可以指定要取得的是那个对象的锁。【查看详情】不管是同步代码块还是同步方法,每次只有一个线程可以进入,如果其他线程试图进入(不管是同一同步块还是不同的同步块),JVM会将它们挂起(放入到等锁池中)。这种结构在并发理论中称为临界区(critical section)。这里我们可以对Java中用synchronized实现同步和锁的功能做一个总结:- 只能锁定对象,不能锁定基本数据类型。- 被锁定的对象数组中的单个对象不会被锁定。- 同步方法可以视为包含整个方法的synchronized(this) { ... }代码块。- 静态同步方法会锁定它的Class对象。- 内部类的同步是独立于外部类的。- synchronized修饰符并不是方法签名的组成部分,所以不能出现在接口的方法声明中。- 非同步的方法不关心锁的状态,它们在同步方法运行时仍然可以得以运行。- sync

您可能关注的文档

文档评论(0)

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

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

版权声明书
用户编号:7014141164000003

1亿VIP精品文档

相关文档