Java理论与实践: 并发在一定程度上使一切变得简单[Java编程]
本文“Java理论与实践: 并发在一定程度上使一切变得简单[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
当项目中需求 XML 解析器、文本索引程序和搜索引擎、正则表达式编译器、 XSL 处理器或 PDF 生成器时,我们中大大都人从不会考虑自己去编写这些实用 程序.每当需求这些设备时,我们会利用商业实现或开放源码实现来履行这些任 务缘由很简单 ― 现有实现工作得很好,并且易于利用,自己编写这些实用程序 会事倍功半,大概乃至得不到后果.作为软件工程师,我们更乐意遵守艾萨克 ・牛顿的信念 ― 站在伟人的肩膀之上,有时这是可取的,但并不老是这 样.(在 Richard Hamming 的 Turing Award 讲座中,他认为计算机科学家的 “自立”要更可取.)
根究反复创造“车轮”之 缘由
关于一些几近每个服务器利用程序都需求的初级利用程序框架服务 (如日记记录、数据库衔接实用、高速缓存和任务调度等),我们看到这些基本 的底子构造服务被一遍又一各处重写.为什么会发生这种情形?因为现有的挑选 不够充分,大概因为定制版本要更好些或更合适手边的利用程序,但我认为这是 不必要的.事实上,专为某个利用程序开辟的定制版本常常并不比遍及可用的、 通用的实现更合适于该利用程序,大概会更差.比方,固然您不喜好 log4j,但 它可以完成任务.固然自己开辟的日记记录系统大概有一些 log4j 所贫乏的特 定特点,但关于大大都利用程序,您很难证明,一个完善的定制日记记录包值得 付出重新编写的代价,而不利用现有的、通用的实现.但是,很多项目团队终究 还是自己一遍又一各处编写日记记录、衔接实用或线程调度包.
表面上 看起来简单
我们不考虑自己去编写 XSL 处理器的缘由之一是,这将耗费 大量的工作.但这些初级的框架服务表面上看起来简单,所以自己编写它们仿佛 并不艰难.但是,它们很难正常工作,并不象开始看起来那样.这些特别的 “轮子”一向处在反复创造之中的主要缘由是,在给定的利用程序中 ,常常一开始对这些工具的需求非常小,但当您碰到了无数别的项目中也存在的 一样问题时,这种需求会逐突变大.来由普通象这样:“我们不需求完善 的日记记录/调度/高速缓存包,只需求一些简单的包,所以只编写一些能到达 我们目的的包,我们将针对自己特定的需求来调整它”.但情形常常是, 您很快扩大了所编写的这个简单工具,并试图增添再增添更多的特点,直到编写 出一个完善的底子构造服务.至此,您普通会固执于自己所编写的程序,无论它 是好是坏.您已经为构建自己的程序付出了全部的代价,所以除了转至通用的实 现所实际投入的迁移本钱之外,还必须降服这种“已支付本钱”的障 碍.
并发构件的代价所在
编写调度和并发底子构造类的确要比看上去难.Java 语言供应了一组有效的 初级同步原语: wait() 、 notify() 和 synchronized ,但具体利用这些原语 需求一些本领,需求考虑性能、死锁、公道性、资源管理以及若何避免线程安全 性方面带来的危害等诸多因素.并发代码难以编写,更难以测试 ― 即便专家有 时在第一次时也会呈现错误. Concurrent Programming in Java(请参阅 参考 资料)的作者 Doug Lea 编写了一个极端优异的、免费的并发实用程序包,它包 括并发利用程序的锁、互斥、行列、线程池、轻量级任务、有效的并发调集、原 子的算术操作和别的基本构件.人们普通称这个包为 util.concurrent (因为 它实际的包名很长),该包将形成 Java Community Process JSR 166 正在尺度 化的 JDK 1.5 中 java.util.concurrent 包的底子.同时, util.concurrent 经过了杰出的测试,很多服务器利用程序(包含 JBoss J2EE 利用程序服务器) 都利用这个包.
弥补空白
核心 Java 类库中略去了一组有效的高级同步工具(比方互斥、信号和阻塞 、线程安全调集类).Java 语言的并发原语 ― synchronization 、 wait() 和 notify() ― 关于大大都服务器利用程序的需求而言过于初级.假如要试图 获得锁,但假如在给定的时间段内超时了还没有得到它,会发生什么情形?假如 线程中止了,则放弃获得锁的尝试?成立一个至多可有 N 个线程持有的锁?支 持多种方法的锁定(比方带互斥写的并发读)?大概以一种方法来获得锁,但以 另一种方法释放它?内置的锁定机制不直接支持上述这些情形,但可以在 Java 语言所供应的基本并发原语上构建它们.但是这样做需求一些本领,并且简单出 错.
服务器利用程序开辟人员需求简单的设备来履行互斥、同步事件呼应、跨活 动的数据通信以及异步地调度任务.关于这些任务,Java 语言所供应的初级原 语很难用,并且简单出错. util.concurrent 包的目的在于通过供应一组用于 锁定、阻塞行列和任务调度的类来弥补这项空白,从而可以处理一些常见的错误 情形大概限制任务行列和运行中的任务所损耗的资源.
以上是“Java理论与实践: 并发在一定程度上使一切变得简单[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |