You are on page 1of 11

Excluso Mtua e Objectos Partilhados

3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV

 /XtV *RPHV

Problema do Jardim Ornamentado


2VYLVLWDQWHVHQWUDPQRMDUGLPRUQDPHQWDGRDWUDYpVGHGXDVHQWUDGDV HP.UX]PyYHO WXUQVWLOH $DGPLQLVWUDomRGRMDUGLPGHVHMDVDEHU TXDQWRVYLVLWDQWHVHVWmRQRMDUGLPHP.DGDLQVWDQWH DVVXPLQGRTXH .DGDYLVLWDQWHTXHHQWUDQmRVDL 

Garden

West Turnstile

people

East Turnstile

2SURJUDPD .RQ.RUUHQWH p.RQVWLWXtGRSRUGRLVWKUHDGV.RQ.RUUHQWHV HXPREMH.WR R.RQWDGRU SDUWLOKDGR


3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV  /XtV *RPHV

diagrama de classes (em UML)


Applet Thread

Garden init() go()

east,west

Turnstile run()

people

Counter increment()

eastD, westD, counterD

display

display

NumberCanvas setvalue()

2WKUHDGTurnstileVLPXODD.KHJDGDSHULyGL.D SRUVHJXQGR GHXP YLVLWDQWHDRMDUGLPSHODVXVSHQVmRGDVXDD.WLYLGDGHHLQYR.DR PpWRGRincrement()GRREMH.WRCounter


3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV  /XtV *RPHV

programa do jardim ornamentado


2REMH.WRCounterHRWKUHDGTurnstileVmR.ULDGRVSHORPpWRGR go()GRDSSOHWGarden

private void go() { counter = new Counter(counterD); west = new Turnstile(westD,counter); east = new Turnstile(eastD,counter); west.start(); east.start(); }
.RXQWHU'ZHVW'HHDVW'VmRREMH.WRVGD.ODVVH 1XPEHU&DQYDV
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV  /XtV *RPHV

a classe Turnstile
class Turnstile extends Thread { NumberCanvas display; Counter people; Turnstile(NumberCanvas n,Counter c) { display = n; people = c; }

public void run() { try{ display.setvalue(0); for (int i=1;i<=Garden.MAX;i++){ Thread.sleep(500); //0.5 segundo entre chegadas display.setvalue(i); people.increment(); } } catch (InterruptedException e) {} }}
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV

2PpWRGRUXQ WHUPLQDDSyV *DUGHQ0$; YLVLWDQWHV WHUHPHQWUDGR QRMDUGLP.

 /XtV *RPHV

a classe Counter
class Counter { int value=0; NumberCanvas display; Counter(NumberCanvas n) { display=n; display.setvalue(value); } void increment() { int temp = value; //ler valor Simulate.HWinterrupt(); value=temp+1; //escrevre valor display.setvalue(value); } }
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV  /XtV *RPHV

programa do jardim ornamentado - visualizao de uma execuo

$SyVDH[H.XomRGRVWKUHDGVEastHWest.DGDXP.RQWRX Garden.MAX  YLVLWDQWHV2Q~PHURGHYLVLWDQWHVQRMDUGLP RUQDPHQWDGRQmRpDVRPDGRVQ~PHURVGHYLVLWDQWHVTXHHQWUDUDP SHODVGXDVHQWUDGDV$OJXQVLQ.UHPHQWRVIRUDPSHUGLGRV


3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV  /XtV *RPHV

activao dos mtodos concorrentes em Java


$H[H.XomRGRVPpWRGRVQR-DYDQmRVmRDWyPL.RVRVREMH.WRVWKUHDG east H west SRGHPVHUH[H.XWDGRVSHORPpWRGRincremento() VLPXOWDQHDPHQWH

west 3&
SURJUDPD .RQWDGRU

.yGLJRSDUWLOKDGR

east 3&
SURJUDPD .RQWDGRU

LQ.UHPHQWR OHUYDORU HV.UHYHUYDORU

3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV

 /XtV *RPHV

modelo do jardim ornamentado (diagrama de estrutura)


go end go end arrive

GARDEN
value

east: TURNSTILE
go end arrive

value:VAR
read write

display

value

west: TURNSTILE

2SUR.HVVRVARHVSH.LIL.DRD.HVVRSDUDOHLWXUDHHV.ULWDQR.RQWDGRU YDULiYHO SDUWLOKDGRvalue. 2LQ.UHPHQWRpHVSH.LIL.DGRQRLQWHULRUGH TURNSTILE GHVGHTXHDV H[H.Xo}HVGRVPpWRGRVQmRVHMDPDWyPL.DVLHRVREMH.WRVWKUHDGeast H west SRGHPVHULQWHU.DODGRVQDVVXDVD.o}HVread H write
 /XtV *RPHV

3URJUDPDomR&RQ.RUUHQWH

([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV

modelo do jardim ornamentado (especificao FSP)


const N = 4 2DOIDEHWRGRSUR.HVVR range T = 0..N 9$59DU$OSKDp set VarAlpha = { value.{read[T],write[T]} } GH.ODUDGR VAR = VAR[0], H[SOL.LWDPHQWHQD VAR[u:T] = (read[u] ->VAR[u] .RQVWDQWHVHW |write[v:T]->VAR[v]).
2DOIDEHWRGH 785167,/(p HVWHQGLGR.RPR .RQMXQWR9DU$OSKDSDUD JDUDQWLUTXH GHWHUPLQDGDVD.o}HV QmRR.RUUDPOLYUHVHP 9$5LHWRGDVDV ||GARDEN = (east:TURNSTILE || west:TURNSTILE || { east,west,display} ::value:VAR) D.o}HVHP9$5GHYHP VHU.RQWURODGDVSRU /{ go /{ east,west} .go, 785167,/(

TURNSTILE = (go -> RUN), RUN = (arrive-> INCREMENT |end -> TURNSTILE), INCREMENT = (value.read[x:T] -> value.write[x+1]->RUN )+VarAlpha.

end/{ east,west} .end} .

3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV

 /XtV *RPHV

verificao usando o LTSA para deteco de erros

3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV

 /XtV *RPHV

processo de verificao para deteco de erros


T 9HULIL.DomRDXWRPiWL.D.RPSRVLomRGRPRGHOR.RPRSUR.HVVR EST TXH.RPSDUDDVRPDGDV.KHJDGDV.RPRYDORUH[LELGR TEST = TEST[0], TEST[v:T] = (when (v<N){east.arrive,west.arrive}->TEST[v+1] |end->CHECK[v] ), CHECK[v:T] = 7DO.RPRSTOP, ERROR (display.value.read[u:T] -> pXPSUR.HVVR OR.DO (when (u==v) right -> TEST[v] SUpGHILQLGR UHSUHVHQWDGRSHOR |when (u!=v) wrong -> ERROR HVWDGRQR/76 ) HTXLYDOHQWH )+{display.VarAlpha}.
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV  /XtV *RPHV

modelo do jardim ornamentado - deteco de erros ||TESTGARDEN = (GARDEN || TEST).


8VDUR/76$SDUDH[H.XWDUXPDSHVTXLVDH[DXVWLYDGHERROR Trace to property violation in TEST: go 2/76$SURGX]R east.arrive .DPLQKRPDLV.XUWR east.value.read.0 SDUDDO.DQoDUR west.arrive SUR.HVVR HVWDGR west.value.read.0 ERROR. east.value.write.1 $OJXQVLQ.UHPHQWRVVmR west.value.write.1 SHUGLGRVHP.RQVHTXrQ.LDGD end YDULiYHOSDUWLOKDGDQmRVHU display.value.read.1 D.WXDOL]DGDDWRPL.DPHQWH wrong
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV  /XtV *RPHV

interferncia e excluso mtua


$ D.WXDOL]DomR GHVWUXWLYD SURYR.DGD SHOD LQWHU.DODomR DUELWUiULD GDV D.o}HV read H write p GHVLJQDGD SRU LQWHUIHUrQ.LD

1RVSURJUDPDV.RQ.RUUHQWHVRVHUURV EXJV SURYR.DGRVSHOD LQWHUIHUrQ.LDVmRPXLWRGLIt.HLVGHOR.DOL]DU$VROXomRWtSL.D SDUDHYLWDUHVWHWLSRGHHUURVpIRUQH.HUPpWRGRVGHD.HVVR PXWXDPHQWHH[.OXVLYRSDUDREMH.WRVSDUWLOKDGRV GHVWD IRUPDJDUDQWLPRVTXHDD.WXDOL]DomRQmRpLQWHUURPSLGDSRU D.WXDOL]Do}HV.RQ.RUUHQWHV $H[.OXVmRP~WXDSRGHVHU PRGHODGDDWUDYpVGHD.o}HVDWyPL.DV
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV  /XtV *RPHV

excluso mtua em Java


$V D.WLYDo}HV .RQ.RUUHQWHV GH XP PpWRGR HP -DYD SRGHP VHU PXWXDPHQWH H[.OXVLYDV DGL.LRQDQGR .RPR SUHIL[R D SDODYUD UHVHUYDGDsynchronizedD.DGDPpWRGR $OWHUDPRVD.ODVVHCOUNTERGHULYDQGRXPD.ODVVH SynchronizedCounterHPRGLIL.DPRVRPpWRGRRLQ.UHPHQWRSDUD V\Q.KURQL]HG class SynchronizedCounter extends Counter { SynchronizedCounter(NumberCanvas n) {super(n);} synchronized void increment() { super.increment(); } }
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV  /XtV *RPHV

prob. do jardim ornamentado - excluso mtua em Java

2-DYDDVVR.LDXPOR.NDWRGRRREMH.WR2.RPSLODGRU-DYDLQVHUH .yGLJRSDUDREWHUROR.NDQWHVGDH[H.XomRGR.RUSRGRPpWRGRD VLQ.URQL]DUH.yGLJRSDUDGHVD.WLYDUROR.NDQWHVGRPpWRGR UHWRUQDURUHVXOWDGR2VWKUHDGV .RQ.RUUHQWHV HVWmREORTXHDGRV DWpROR.NVHUGHVD.WLYDGR


3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV  /XtV *RPHV

excluso mtua no Java - synchronized


2D.HVVRSRUH[.OXVmRP~WXDDXPREMH.WRSRGHVHU.RQVHJXLGRXVDQGR DLQVWUXomRV\Q.KURQL]HG

synchronized (object) { statements }


8PDRXWUDIRUPD.RUUH.WDPDVPHQRVHOHJDQWHpPRGLIL.DURPpWRGR Turnstile.run()

synchronized(counter) {counter.increment();}
3DUDJDUDQWLURD.HVVRSRUH[.OXVmRP~WXDDXP REMH.WRWRGRVRVPpWRGRVGRVREMH.WRV .RQ.RUUHQWHV GHYHPVHUVLQ.URQL]DGRV
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV  /XtV *RPHV

modelar a excluso mtua (em FSP)


3DUDDGL.LRQDURPH.DQLVPRGHOR.NLQJDRPRGHOR)63GHILQLPRVRSUR.HVVRLOCK, ID]HPRVD.RPSRVLomR.RPRSUR.HVVRSDUWLOKDGRVAR QRSUR.HVVRGARDENH PRGLIL.DPRVRDOIDEHWR

LOCK = (acquire->release->LOCK). ||LOCKVAR = (LOCK || VAR). set VarAlpha = {value.{read[T],write[T], acquire, release}} PRGLIL.DPRVWDPEpPTURNSTILESDUDD.WLYDUHGHVD.WLYDUROR.N TURNSTILE = (go -> RUN), RUN = (arrive-> INCREMENT |end -> TURNSTILE), INCREMENT = (value.acquire -> value.read[x:T]->value.write[x+1] -> value.release->RUN )+VarAlpha.
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV  /XtV *RPHV

modelo do jardim ornamentado - verificao


go east.arrive east.value.acquire east.value.read.0 east.value.write.1 east.value.release west.arrive west.value.acquire west.value.read.1 west.value.write.2 west.value.release end display.value.read.2 right
8VDURSUR.HVVRTESTH/76$SDUDH[H.XWDUXPDYHULIL.DomR DXWRPiWL.D H[DXVWLYD

3URJUDPDomR&RQ.RUUHQWH

([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV

 /XtV *RPHV

COUNTER: abstraco usando cancelamento


3DUDPRGHODUREMH.WRV SDUWLOKDGRVHPWHUPRVGRVVHXV PpWRGRVVLQ.URQL]DGRV SRGHPRVDEVWUDLUDOJXQV GHWDOKHVUH.RUUHQGRDR .DQ.HODPHQWR SynchronizedCounter DEVWUDLPRVDVD.o}HVread writeacquirerelease

const N = 4 range T = 0..N

VAR = VAR[0], VAR[u:T] = ( read[u]->VAR[u] | write[v:T]->VAR[v]). 3DUDRPpWRGR LOCK = (acquire->release->LOCK).

INCREMENT = (acquire->read[x:T] -> (when (x<N) write[x+1] ->release->increment->INCREMENT ) )+{read[T],write[T]}. ||COUNTER = (INCREMENT||LOCK||VAR)@{increment}.
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV

 /XtV *RPHV

COUNTER: abstraco usando o cancelamento (cont.) /76 PLQLPL]DGR


increment increment increment increment

8PDGHV.ULomRPDLVDEVWUD.WDGHCOUNTERTXHJHUDXP/76LGrQWL.R

COUNTER = COUNTER[0] COUNTER[v:T] = (when (v<N) increment -> COUNTER[v+1]). (VWHSUR.HVVRH[LEHXP.RPSRUWDPHQWRHTXLYDOHQWHLHWHPXP .RPSRUWDPHQWRREVHUYiYHOLGrQWL.R
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV  /XtV *RPHV

Sumrio .RQ.HLWRV
z LQWHUIHUrQ.LDGHSUR.HVVRV z H[.OXVmRP~WXD

PRGHORV
z PRGHO.KH.NLQJ YHULIL.DomR SDUDDLQWHUIHUrQ.LD z PRGHODUDH[.OXVmRP~WXD

LPSOHPHQWDomRHP-DYD
z LQWHUIHUrQ.LDGRVWKUHDGVHPREMH.WRVSDUWLOKDGRVQR-DYD z H[.OXomRP~WXDQR-DYD V\Q.KURQL]HGREMH.WRVPpWRGRV 

3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV

 /XtV *RPHV

You might also like