欢迎来到天天文库
浏览记录
ID:27792406
大小:70.00 KB
页数:7页
时间:2018-12-06
《剖析同步器-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、剖析同步器-编程开发技术剖析同步器译文出处:丁一原文出处:JakobJenkov虽然许多同步器(如锁,信号量,阻塞队列等)功能上各不相同,但它们的内部设计上却弟别不大。换句话说,它们内部的的基础部分是相同(或相似)的。了解这些基础部件能在设计同步器的时候给我们大大的帮助。这就是本文要细说的内容。注:本文的内容是哥本哈根信息技术大学一个ft]JakobJenkov,TokeJohansen和LarsBj?rn参与的M・Sc.学生项目的部分成果。在此项目期间我们咨询DougS3是否知道类似的研究。有趣的是在开发J3V35并发工具包期间他已经提出了类似的结论。D
2、ougLea的研究,我相信,在OavaConcurrencyinPracticed一书中有描述。这木书有一章“剖析同步器”就类似于木文,但不尽和同。大部分同步器都是用来保护某个区域(临界区)的代码,这些代码可能会被多线程并发访问。要实现这个目标,同步器一般要支持下列功能:1.状态2.访问条件3.状态变化4.通知策略5.Test・and・Set方法6.Set方法并不是所有同步器都包含上述部分,也有些并不完全遵照上面的内容。但通常你能从中发现这些部分的一或多个。状态同步器中的状态是用來确定某个线程是否冇访问权限。在Lock中,状态是boolean类型的,表示当
3、丽Lock对象是否处丁•锁定状态。在BoundedScmaphorc屮,内部状态包含一个计数器(int类型)和一个上限(int类型),分别表示当前已经获取的许可数和最大可获取的许可数。BlockingQueue的状态是该队列屮元素列表以及队列的最大容量。下面是Lock和BoundedSemaphore中的两个代码片段。publicclassLock{//stateiskepthereprivatebooleanisLocked=false;publicsynchronizedvoidlock()throwsInterruptedException{whil
4、e(isLocked){wait();}isLocked二true;publicclassBoundedSemaphore{//stateiskepthereprivateintsignals=0;privateintbound=0;publicBoundedSemaphore(intupperBound){this.bound二uppcrBound;}publicsynchronizedvoidtake()throwsInterruptedException{while(this,signals二二bound)wait();this.signal++;t
5、his.notify();}•••}访问条件访问条件决定调用tcst-and-sct-statc方法的线程是否可以对状态进行设置。访问条件一般是基于同步器状态的。通常是放在一个while循环里,以避免虚假唤醒问题。访问条件的计算结果要么是true要么是false。Lock中的访问条件只是简单地检查isLocked的值。根据执行的动作是“获取”述是"释放”,BoundedSemaphore屮实际上有两个访问条件。如果某个线程想“获取”许可,将检查signals变量是否达到上限;如果某个线程想“释放”许可,将检杳signals变量是否为0。这里有两个来自Loc
6、k和BoundedSemaphore的代码片段,它们都有访问条件。注意观察条件是怎样在wh订e循环中检查的。publicclassLock{privatebooleanisLocked二false;publicsynchronizedvoidlock()throwsInterruptedException{//accessconditionwhile(isLocked){wait();isLocked二true;}•••JpublicclassBoundedSemaphore{privateintsignals=0;privateintbound二0;pu
7、blicBoundcdScmaphorc(intuppcrBound){this.bound=upperBound;}publicsynchronizedvoidtake()throwsInterruptedException{//accessconditionwhilc(this.signals二二bound)wait();this.signals++;this,notify();}publicsynchronizedvoidrelease()tbrowsTnterruptedException{//accessconditionwhile(this,s
8、ignals==0)wait();this,signals--;t
此文档下载收益归作者所有