Thread Synchronization Java 线程同步.docx
- 文档编号:26990842
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:15
- 大小:42.88KB
Thread Synchronization Java 线程同步.docx
《Thread Synchronization Java 线程同步.docx》由会员分享,可在线阅读,更多相关《Thread Synchronization Java 线程同步.docx(15页珍藏版)》请在冰豆网上搜索。
ThreadSynchronizationJava线程同步
ThreadSynchronization
OneofthestrengthsoftheJavaprogramminglanguageisitssupportformultithreadingatthelanguagelevel.Muchofthissupportcentersonsynchronization:
coordinatingactivitiesanddataaccessamongmultiplethreads.ThemechanismthatJavausestosupportsynchronizationisthemonitor.ThischapterdescribesmonitorsandshowshowtheyareusedbytheJavavirtualmachine.Itdescribeshowoneaspectofmonitors,thelockingandunlockingofdata,issupportedintheinstructionset.
Monitors
Java'smonitorsupportstwokindsofthreadsynchronization:
mutualexclusionandcooperation.Mutualexclusion,whichissupportedintheJavavirtualmachineviaobjectlocks,enablesmultiplethreadstoindependentlyworkonshareddatawithoutinterferingwitheachother.Cooperation,whichissupportedintheJavavirtualmachineviathewaitandnotifymethodsofclassObject,enablesthreadstoworktogethertowardsacommongoal.
Amonitorislikeabuildingthatcontainsonespecialroomthatcanbeoccupiedbyonlyonethreadatatime.Theroomusuallycontainssomedata.Fromthetimeathreadentersthisroomtothetimeitleaves,ithasexclusiveaccesstoanydataintheroom.Enteringthemonitorbuildingiscalled"enteringthemonitor."Enteringthespecialroominsidethebuildingiscalled"acquiringthemonitor."Occupyingtheroomiscalled"owningthemonitor,"andleavingtheroomiscalled"releasingthemonitor."Leavingtheentirebuildingiscalled"exitingthemonitor."
Inadditiontobeingassociatedwithabitofdata,amonitorisassociatedwithoneormorebitsofcode,whichinthisbookwillbecalledmonitorregions.Amonitorregioniscodethatneedstobeexecutedasoneindivisibleoperationwithrespecttoaparticularmonitor.Inotherwords,onethreadmustbeabletoexecuteamonitorregionfrombeginningtoendwithoutanotherthreadconcurrentlyexecutingamonitorregionofthesamemonitor.Amonitorenforcesthisone-thread-at-a-timeexecutionofitsmonitorregions.Theonlywayathreadcanenteramonitorisbyarrivingatthebeginningofoneofthemonitorregionsassociatedwiththatmonitor.Theonlywayathreadcanmoveforwardandexecutethemonitorregionisbyacquiringthemonitor.
Whenathreadarrivesatthebeginningofamonitorregion,itisplacedintoanentrysetfortheassociatedmonitor.Theentrysetislikethefronthallwayofthemonitorbuilding.Ifnootherthreadiswaitingintheentrysetandnootherthreadcurrentlyownsthemonitor,thethreadacquiresthemonitorandcontinuesexecutingthemonitorregion.Whenthethreadfinishesexecutingthemonitorregion,itexits(andreleases)themonitor.
Ifathreadarrivesatthebeginningofamonitorregionthatisprotectedbyamonitoralreadyownedbyanotherthread,thenewlyarrivedthreadmustwaitintheentryset.Whenthecurrentownerexitsthemonitor,thenewlyarrivedthreadmustcompetewithanyotherthreadsalsowaitingintheentryset.Onlyonethreadwillwinthecompetitionandacquirethemonitor.
Thefirstkindofsynchronizationlistedabove,mutualexclusion,referstothemutuallyexclusiveexecutionofmonitorregionsbymultiplethreads.Atanyonetime,onlyonethreadcanbeexecutingamonitorregionofaparticularmonitor.Ingeneral,mutualexclusionisimportantonlywhenmultiplethreadsaresharingdataorsomeotherresource.Iftwothreadsarenotworkingwithanycommondataorresource,theyusuallycan'tinterferewitheachotherandneedn'texecuteinamutuallyexclusiveway.OnaJavavirtualmachineimplementationthatdoesn'ttimeslice,however,ahigherprioritythreadthatisneverblockedwillinterferewithanylowerprioritythreads,evenifnoneofthethreadssharedata.ThehigherprioritythreadwillmonopolizetheCPUattheexpenseofthelowerprioritythreads.LowerprioritythreadswillnevergetanyCPUtime.Insuchacase,amonitorthatprotectsnodatamaybeusedtoorchestratethesethreadstoensureallthreadsgetsomeCPUtime.Nevertheless,inmostcasesamonitorprotectsdatathatisaccessedthroughthemonitorregioncode.Incaseswherethedatacanbeaccessedonlythroughthemonitorregions,themonitorenforcesmutuallyexclusiveaccesstothatdata.
Theotherkindofsynchronizationlistedaboveassupportedbymonitorsiscooperation.Whereasmutualexclusionhelpskeepthreadsfrominterferingwithoneanotherwhilesharingdata,cooperationhelpsthreadstoworktogethertowardssomecommongoal.
Cooperationisimportantwhenonethreadneedssomedatatobeinaparticularstateandanotherthreadisresponsibleforgettingthedataintothatstate.Forexample,onethread,a"readthread,"maybereadingdatafromabufferthatanotherthread,a"writethread,"isfilling.Thereadthreadneedsthebuffertobeina"notempty"statebeforeitcanreadanydataoutofthebuffer.Ifthereadthreaddiscoversthatthebufferisempty,itmustwait.Thewritethreadisresponsibleforfillingthebufferwithdata.Oncethewritethreadhasdonesomemorewriting,thereadthreadcandosomemorereading.
TheformofmonitorusedbytheJavavirtualmachineiscalleda"WaitandNotify"monitor.(Itisalsosometimescalleda"SignalandContinue"monitor.)Inthiskindofmonitor,athreadthatcurrentlyownsthemonitorcansuspenditselfinsidethemonitorbyexecutingawaitcommand.Whenathreadexecutesawait,itreleasesthemonitorandentersawaitset.Thethreadwillstaysuspendedinthewaitsetuntilsometimeafteranotherthreadexecutesanotifycommandinsidethemonitor.Whenathreadexecutesanotify,itcontinuestoownthemonitoruntilitreleasesthemonitorofitsownaccord,eitherbyexecutingawaitorbycompletingthemonitorregion.Afterthenotifyingthreadhasreleasedthemonitor,thewaitingthreadwillberesurrectedandwillreacquirethemonitor.
ThekindofmonitorusedintheJavavirtualmachineissometimescalledaSignalandContinuemonitorbecauseafterathreaddoesanotify(thesignal)itretainsownershipofthemonitorandcontinuesexecutingthemonitorregion(thecontinue).Atsomelatertime,thenotifyingthreadreleasesthemonitorandawaitingthreadisresurrected.Presumably,thewaitingthreadsuspendeditselfbecausethedataprotectedbythemonitorwasn'tinastatethatwouldallowthethreadtocontinuedoingusefulwork.Also,thenotifyingthreadpresumablyexecutedthenotifycommandafterithadplacedthedataprotectedbythemonitorintothestatedesiredbythewaitingthread.Butbecausethenotifyingthreadcontinued,itmayhavealteredthestateafterthenotifysuchthatthewaitingthreadstillcan'tdousefulwork.Alternatively,athirdthreadmayhaveacquiredthemonitorafterthenotifyingthreadreleaseditbutbeforethewaitingthreadacquiredit,andthethirdthreadmayhavechangedthestateoftheprotecteddata.Asaresult,anotifymustoftenbeconsideredbywaitingthreadsmerelyasahintthatthedesiredstatemayexist.Eachtimeawaitingthreadisresurrected,itmayneedtocheckthestateagaintodeterminewhetheritcanmoveforwardanddousefulwork.Ifitfindsthedatastillisn'tinthedesiredstate,thethreadcouldexecuteanotherwaitorgiveupandexitthemonitor.
Asanexample,consideronceagainthescenariodescribedabovethatinvolvesabuffer,areadthread,andawritethread.Assumethebufferisprotectedbyamonitor.Whenareadthreadentersthemonitorthatprotectsthebuffer,itcheckstoseeifthebufferisempty.Ifthebufferisnotempty,thereadthreadreads(andremoves)somedatafromthebuffer.Satisfied,itexitsthemonitor.Ontheotherhand,ifthebufferisempty,thereadthreadexecutesawaitcommand.Assoonasitexecutesthewait,thereadthreadissuspendedandplacedintothemonitor'swaitset.Intheprocess,thereadthreadreleasesthemonitor,whichbecomesavailabletootherthreads.Atsomelatertime,thewritethreadentersthemonitor,writessomedataintothebuffer,executesanotify,andexitsthemonitor.Whenthewritethreadexecutesthenotify,thereadthreadismarkedforeventualresurrection.Afterthewritethreadhasexitedthemonitor,thereadthreadisresurrectedastheownerofthemonitor.Ifthereisanychancethatsomeotherthreadhascomealongandconsumedthedataleftbythewritethread,thereadthreadmustexplicitlychecktomakesurethebufferisnotempty.Ifthereisnochancethatanyotherthreadhasconsumedthedata,thenthereadthreadcanjustassumethedataexists.Thereadthreadreadssomedatafromthebufferandexitsthemonitor.
AgraphicaldepictionofthekindofmonitorusedbyaJavavirtualmachineisshowninFigure20-1.Thisfigureshowsthemonitorasthreerectangles.Inthecenter,alargerectanglecontainsasinglethread,themonitor'sowner.Ontheleft,asmallrectanglecontainstheentryset.Ontheright,anothersmallrectanglecontainsthewaitset.Activethreadsareshownasdarkgraycircles.Suspendedthreadsareshownaslightgraycircles.
Figure20-1alsoshowsseveralnumbereddoorsthatthreadsmust"passthrough"tointeractwiththemonitor.Whenathreadarrivesatthestartofamonitorregion,itentersthemonitorviatheleftmostdoor,doornumberone,andfindsitselfintherectanglethathousestheentryset.Ifnothreadcurrentlyownsthemonitorandnootherthreadsarewaitingintheentryset,thethreadpassesimmediatelythroughthenextdoor,doornumbertwo,andbecomestheownerofthemonitor.Asthemonitorowner,thethreadcontinuesexecutingthemonitorregion.If,ontheother
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Thread Synchronization Java 线程同步 线程 同步