- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
多线程开发的捷径:构建Java并发模型框架
Java多线程特性为构建高性能的应用提供了极大的方便,但是也带来了不少的麻烦。线程间同步、数据一致性等烦琐的问题需要细心的考虑,一不小心就会出现一些微妙的,难以调试的错误。 另外,应用逻辑和线程逻辑纠缠在一起,会导致程序的逻辑结构混乱,难以复用和维护。本文试图给出一个解决这个问题的方案,通过构建一个并发模型框架(framework),使得开发多线程的应用变得容易。 基础知识 Java语言提供了对于线程很好的支持,实现方法小巧、优雅。对于方法重入的保护,信号量(semaphore)和临界区(critical section)机制的实现都非常简洁。可以很容易的实现多线程间的同步操作从而保护关键数据的一致性。这些特点使得Java成为面向对象语言中对于多线程特性支持方面的佼佼者(C++正在试图把boost库中的对于线程的支持部分纳入语言标准)。 Java中内置了对于对象并发访问的支持,每一个对象都有一个监视器(monitor),同时只允许一个线程持有监视器从而进行对对象的访问,那些没有获得监视器的线程必须等待直到持有监视器的线程释放监视器。对象通过synchronized关键字来声明线程必须获得监视器才能进行对自己的访问。 synchronized声明仅仅对于一些较为简单的线程间同步问题比较有效,对于哪些复杂的同步问题,比如带有条件的同步问题,Java提供了另外的解决方法,wait/notify/notifyAll。 获得对象监视器的线程可以通过调用该对象的wait方法主动释放监视器,等待在该对象的线程等待队列上,此时其他线程可以得到监视器从而访问该对象,之后可以通过调用notify/notifyAll方法来唤醒先前因调用wait方法而等待的线程。 一般情况下,对于wait/notify/notifyAll方法的调用都是根据一定的条件来进行的,比如:经典的生产者/消费者问题中对于队列空、满的判断。熟悉POSIX的读者会发现,使用wait/notify/notifyAll可以很容易的实现POSIX中的一个线程间的高级同步技术:条件变量。 简单例子 本文将围绕一个简单的例子展开论述,这样可以更容易突出我们解决问题的思路、方法。本文想向读者展现的正是这些思路、方法。这些思路、方法更加适用于解决大规模、复杂应用中的并发问题。考虑一个简单的例子,我们有一个服务提供者,它通过一个接口对外提供服务,服务内容非常简单,就是在标准输出上打印Hello World。类结构图如下: 代码如下: 1.interface Service 2.{ 3.??? public void sayHello(); 4.} 5.class ServiceImp implements Service 6.{ 7.??? public void sayHello() { 8.??????? System.out.println(Hello World!); 9.??? } 10.} 11.class Client 12.{ 13.??? public Client(Service s) { 14.??????? _service = s; 15.} 16.??? public void requestService() { 17.??????? _service.sayHello(); 18.??? } 19.??? private Service _service; 20.} 如果现在有新的需求,要求该服务必须支持Client的并发访问。一种简单的方法就是在ServicImp类中的每个方法前面加上synchronized声明,来保证自己内部数据的一致性(当然对于本例来说,目前是没有必要的,因为ServiceImp没有需要保护的数据,但是随着需求的变化,以后可能会有的)。但是这样做至少会存在以下几个问题: 1.现在要维护ServiceImp的两个版本:多线程版本和单线程版本(有些地方,比如其他项目,可能没有并发的问题),容易带来同步更新和正确选择版本的问题,给维护带来麻烦。 2.如果多个并发的Client频繁调用该服务,由于是直接同步调用,会造成Client阻塞,降低服务质量。 3.很难进行一些灵活的控制,比如:根据Client的优先级进行排队等等。 4.这些问题对于大型的多线程应用服务器尤为突出,对于一些简单的应用(如本文中的例子)可能根本不用考虑。本文正是要讨论这些问题的解决方案,文中的简单的例子只是提供了一个说明问题,展示思路、方法的平台。 5.如何才能较好的解决这些问题,有没有一个可以重用的解决方案呢?让我们先把这些问题放
您可能关注的文档
- 计算机基础与程序设计-要点分栏.docx
- WCF服务实例激活类型编程与开发.docx
- Android 控件xml属性详解.docx
- 多线程详细分析.doc
- 微软2012暑期实习题.docx
- c++ c Java调用DLL(通过VS2010).doc
- java_Timer定时器实例_Spring实例.doc
- MyEclipse 8.0汉化插件使用方法.doc
- webservice环境搭建.doc
- axis_webservice教程.doc
- 2025年[公路水运工程试验检测人员考试密押题库与答案解析]公路水运工程助理试验检测师道路工程模拟1.pdf
- 2025年[奶茶创新创业准备计划书]奶茶店创新创业计划书.pdf
- 2025年[全]钳工初级考试题库含答案.pdf
- 董事长的年会发言稿模板.doc
- 2025年[未审核]{万艳芳}科研工作评估与持续改进方案.pdf
- 2025年[土建造价员考试密押题库与答案解析]土建工程施工图预算的编制.pdf
- 2025-2026学年上海师范大学附属中学高一下学期5月月考化学试卷含详解.docx
- (一模)梅州市2026届高三总复习质检英语试卷(含答案).docx
- 2025年[医学类考试密押题库与答案解析]口腔执业医师分类模拟4.pdf
- 2025年[安徽]人防地下室主体自评报告.pdf
有哪些信誉好的足球投注网站
文档评论(0)