tmpa-2017: dl-check: dynamic potential deadlock detection tool for java programs
TRANSCRIPT
Dl-Check:dynamicpotentialdeadlockdetectiontoolforJavaprograms
NikitaKoval1,2 DmitryTsitelov2 RomanElizarov2
1ITMOUniversity,ComputerTechnologyDepartment,St.Petersburg,[email protected]
2Devexperts,LLC,St.Petersburg,Russia,
TMPAConference,March2017
Tableofcontents
1. Introduction2. Algorithm3. Implementation4. Evaluation5. Conclusion
Slide2/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Multithreadedprogrammingproblems
• Datarace• Starvation• Livelock• Deadlock- Communicationdeadlock- Resourcedeadlock
Slide4/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Resourcedeadlockvoid transfer(Account from,
Account to,int amount) {
from.lock()to.lock()// Do transferunlock(from, to)
}transfer(a, b, …):1 a.lock()
4 b.lock()
transfer(b, a, …):
2 b.lock()3 a.lock()
DEADLOCK!
Slide5/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Analysisapproaches
• Staticanalysis- Canguaranteedeadlock-freedom- Manyfalsepositives
• Modelchecking- Canguaranteedeadlock-freedom- Requiresalotofcomputationalresources
• Dynamicanalysis- Dependsontheexecution- Producesfewfalsepositives- Applicableforlargeprograms
Slide6/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Dynamicanalysis
• Collectingexecutiontraces- Analyzescollectedtracesoff-line- e.g.JCarder,MulticoreSDK
• Detectingimmediatelywhenapotentialdeadlockhappens- Hasallcontextinformation,suchasstacktraces- e.g.VisualThreads
Slide7/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
“Acquiredbefore”relation
• Lock𝒖isacquiredbefore lock𝒗(𝒖 → 𝒗) ifatsomepointlock𝒗isacquiredunderlock𝒖inthesamethread
Thread 1 Thread 21 a.lock()2 b.lock()
3 c.lock()4 d.lock()
𝑎 → 𝑏𝑎 → 𝑐𝑎 → 𝑑𝑏 → 𝑐𝑏 → 𝑑𝑐 → 𝑑
Slide9/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Lockhierarchy
• Lockhierarchy isapartialorderonlocks,where𝑢 → 𝑣 ⇒ 𝑜𝑟𝑑 𝑢 < 𝑜𝑟𝑑 𝑣
𝑜𝑟𝑑 𝑎 < 𝑜𝑟𝑑 𝑏𝑜𝑟𝑑 𝑎 < 𝑜𝑟𝑑 𝑐𝑜𝑟𝑑 𝑎 < 𝑜𝑟𝑑 𝑑𝑜𝑟𝑑 𝑏 < 𝑜𝑟𝑑 𝑐𝑜𝑟𝑑 𝑏 < 𝑜𝑟𝑑 𝑑𝑜𝑟𝑑 𝑐 < 𝑜𝑟𝑑(𝑑)
Thread 1 Thread 21 a.lock()2 b.lock()
3 c.lock()4 d.lock()
Slide10/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Potentialdeadlock
• Lockhierarchyisaprimarymethodtoavoiddeadlocks• Potentialdeadlockisalockhierarchyviolation
Thread 1 Thread 21 a.lock()2 b.lock()
3 b.lock()4 a.lock()
𝑎 → 𝑏𝑏 → 𝑎
𝑜𝑟𝑑 𝑎 < 𝑜𝑟𝑑 𝑏𝑜𝑟𝑑 𝑏 < 𝑜𝑟𝑑(𝑎)
Slide11/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Lock-ordergraph(1)
• Everyvertexisassociatedwithalock• Edge 𝒖, 𝒗 meansthat𝒖 → 𝒗• Cyclesrefertopotentialdeadlocks
Thread 1 Thread 21 a.lock()2 b.lock()3 unlock(a, b)
4 b.lock()5 a.lock()6 unlock(a, b)
Slide12/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Lock-ordergraph(2)
Thread 1 Thread 21 a.lock()2 b.lock()3 unlock(a, b)
4 b.lock()5 a.lock()6 unlock(a, b)
• Everyvertexisassociatedwithalock• Edge 𝒖, 𝒗 meansthat𝒖 → 𝒗• Cyclesrefertopotentialdeadlocks
Slide13/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Lock-ordergraph(3)
Thread 1 Thread 21 a.lock()2 b.lock()3 unlock(a, b)
4 b.lock()5 a.lock()6 unlock(a, b)
• Everyvertexisassociatedwithalock• Edge 𝒖, 𝒗 meansthat𝒖 → 𝒗• Cyclesrefertopotentialdeadlocks
Slide14/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Lock-ordergraph(4)
Thread 1 Thread 21 a.lock()2 b.lock()3 unlock(a, b)
4 b.lock()5 a.lock()6 unlock(a, b)
• Everyvertexisassociatedwithalock• Edge 𝒖, 𝒗 meansthat𝒖 → 𝒗• Cyclesrefertopotentialdeadlocks
Slide15/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Minimizationprinciple:problem
• Twocyclesmayrefertothesamepotentialdeadlock
Thread 1 Thread 21 a.lock()2 c.lock()3 b.lock()4 unlock(a,b,c)
5 b.lock()6 a.lock()7 unlock(a,b)
Slide16/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Minimizationprinciple:problem(1)
• Twocyclesmayrefertothesamepotentialdeadlock
Thread 1 Thread 21 a.lock()2 c.lock()3 b.lock()4 unlock(a,b,c)
5 b.lock()6 a.lock()7 unlock(a,b)
Slide17/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Minimizationprinciple:problem(2)
• Twocyclesmayrefertothesamepotentialdeadlock
Thread 1 Thread 21 a.lock()2 c.lock()3 b.lock()4 unlock(a,b,c)
5 b.lock()6 a.lock()7 unlock(a,b)
Slide18/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Minimizationprinciple:problem(3)
• Twocyclesmayrefertothesamepotentialdeadlock
Thread 1 Thread 21 a.lock()2 c.lock()3 b.lock()4 unlock(a,b,c)
5 b.lock()6 a.lock()7 unlock(a,b)
Slide19/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Minimizationprinciple:problem(4)
• Twocyclesmayrefertothesamepotentialdeadlock
Thread 1 Thread 21 a.lock()2 c.lock()3 b.lock()4 unlock(a,b,c)
5 b.lock()6 a.lock()7 unlock(a,b)
Slide20/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Minimizationprinciple:problem(5)
• Twocyclesmayrefertothesamepotentialdeadlock
Thread 1 Thread 21 a.lock()2 c.lock()3 b.lock()4 unlock(a,b,c)
5 b.lock()6 a.lock()7 unlock(a,b)
Slide21/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Minimizationprinciple:problem(6)
• Twocyclesmayrefertothesamepotentialdeadlock
Thread 1 Thread 21 a.lock()2 c.lock()3 b.lock()4 unlock(a,b,c)
5 b.lock()6 a.lock()7 unlock(a,b)
Slide22/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Minimizationprinciple:rule
• Theshortercycleismoreuseful• Onlyoneshortestcycleistobeproduced
Slide23/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Algorithmlayout
• Capturelockacquireandreleaseoperations• Afterlockacquisition:- Addlocktothemultisetoflocksheldbythecurrentthread- Addnewedgestothelock-ordergraph- Reportnewcycles
• Beforelockrelease:- Removelockfromthemultisetofheldlocks
Slide24/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Lockacquisitionandreleasecapturing
Thread 1 Thread 2
4 a.lock()5 c.lock()
7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()
1 b.lock()2 a.lock()3 a.unlock()
6 b.unlock()
Thread#1
Thread#2
Slide25/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Lockacquisitionandreleasecapturing (1)
Thread#1
Thread#2
b
Thread 1 Thread 2
4 a.lock()5 c.lock()
7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()
1 b.lock()2 a.lock()3 a.unlock()
6 b.unlock()
Slide26/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Lockacquisitionandreleasecapturing (2)
Thread#1
Thread#2
ba
Thread 1 Thread 2
4 a.lock()5 c.lock()
7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()
1 b.lock()2 a.lock()3 a.unlock()
6 b.unlock()
Slide27/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Lockacquisitionandreleasecapturing (3)
Thread#1
Thread#2
ba
Thread 1 Thread 2
4 a.lock()5 c.lock()
7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()
1 b.lock()2 a.lock()3 a.unlock()
6 b.unlock()
Slide28/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Lockacquisitionandreleasecapturing (4)
Thread#1
Thread#2
b
a
Thread 1 Thread 2
4 a.lock()5 c.lock()
7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()
1 b.lock()2 a.lock()3 a.unlock()
6 b.unlock()
Slide29/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Lockacquisitionandreleasecapturing (5)
Thread#1
Thread#2
b
ac
Thread 1 Thread 2
4 a.lock()5 c.lock()
7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()
1 b.lock()2 a.lock()3 a.unlock()
6 b.unlock()
Slide30/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Lockacquisitionandreleasecapturing (6)
Thread#1
Thread#2
ac
b
Thread 1 Thread 2
4 a.lock()5 c.lock()
7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()
1 b.lock()2 a.lock()3 a.unlock()
6 b.unlock()
Slide31/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Lockacquisitionandreleasecapturing (7)
Thread#1
Thread#2
acb
Thread 1 Thread 2
4 a.lock()5 c.lock()
7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()
1 b.lock()2 a.lock()3 a.unlock()
6 b.unlock()
Slide32/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Lockacquisitionandreleasecapturing (8)
Thread#1
Thread#2
acb
Thread 1 Thread 2
4 a.lock()5 c.lock()
7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()
1 b.lock()2 a.lock()3 a.unlock()
6 b.unlock()
Slide33/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Lockacquisitionandreleasecapturing (9)
Thread#2
Thread#1
cb
Thread 1 Thread 2
4 a.lock()5 c.lock()
7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()
1 b.lock()2 a.lock()3 a.unlock()
6 b.unlock()
Slide34/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Lockacquisitionandreleasecapturing (10)
Thread#1
Thread#2
b
Thread 1 Thread 2
4 a.lock()5 c.lock()
7 b.lock()8 a.unlock()9 c.unlock()10 b.unlock()
1 b.lock()2 a.lock()3 a.unlock()
6 b.unlock()
Slide35/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Multisetofheldlocks
• Commonlockusagepatternssynchronized(o) {// Do something
}
synchronized void f() {// Do something
}
l.lock()try {// Do something
} finally {l.unlock()
}
• LocksareacquiredandreleasedinLIFO(stack)order
Slide36/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Multisetofheldlocks
• Stackwithpossibilityofremovingfromthemiddle• Commonlyworksin𝑂 1• Worksin𝑂(𝐵) atworst- 𝐵 – numberoflocksacquiredbythecurrentthread
Slide37/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Topologicalorder
• Incrementaltopologicalordermaintenance- MNRalgorithmsuggestedbyMarchetti-Spaccamela etal.
• Theacyclicpartofthelock-ordergraphistobekept• Adding(𝑢, 𝑣) leadstotopologicalorderviolation⇒ theshortestpath𝑣 ↝ 𝑢relatestothecycle
Slide38/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Newnodesprocessing
• Typicalpatterninthelock-ordergraph
x
a
bc
d
e
f g
h
• Onelong-livedlockatthecenterandmanyhundredsofshort-livedlocksaroundit
Slide39/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Newnodesprocessing
• Lock-freebufferfornewnodes• Initializetopologicalordervalue- ifbufferisfull- whenoutgoingedgeshouldbeadded
Newlocknodesbuffer
Lock-ordergraph
Slide40/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Complexity• Onlockacquire- Ifacquisitiondoesnotproducenewcycles• Typicalcase• 𝑂(𝐵 + |𝑉| + |𝐸|)
- Newcycledetected• 𝑂 𝐵 ⋅ 𝑉 + 𝐸
• Onlockrelease- Removesthelockfromthelockmultiset• 𝑂 1 typically• 𝑂 𝐵 atworst
Slide41/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Limitations:cycleminimizationvoid transfer(Account from,
Account to,int amount) {
from.lock()to.lock()// Do transferunlock(from, to)
}1 transfer(a, c, …)2 transfer(c, b, …)3 transfer(b, a, …)4 transfer(a, b, …)
Slide42/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Limitations:cycleminimization(1)void transfer(Account from,
Account to,int amount) {
from.lock()to.lock()// Do transferunlock(from, to)
}1 transfer(a, c, …)2 transfer(c, b, …)3 transfer(b, a, …)4 transfer(a, b, …)
Slide43/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Limitations:cycleminimization(2)void transfer(Account from,
Account to,int amount) {
from.lock()to.lock()// Do transferunlock(from, to)
}1 transfer(a, c, …)2 transfer(c, b, …)3 transfer(b, a, …)4 transfer(a, b, …)
Slide44/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Limitations:cycleminimization(3)void transfer(Account from,
Account to,int amount) {
from.lock()to.lock()// Do transferunlock(from, to)
}1 transfer(a, c, …)2 transfer(c, b, …)3 transfer(b, a, …)4 transfer(a, b, …)
Slide45/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Limitations:cycleminimization(4)void transfer(Account from,
Account to,int amount) {
from.lock()to.lock()// Do transferunlock(from, to)
}1 transfer(a, c, …)2 transfer(c, b, …)3 transfer(b, a, …)4 transfer(a, b, …)
Slide46/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Limitation:cycleminimization(3)
• Edge(𝑣, 𝑢) hasformedacycle• Minimizecycle 𝑢,… , 𝑣 ⇔minimizepath𝑢 ↝ 𝑣- CanbeachievedviaBFS
• Usuallycyclelengthis2or3• Currentimplementationskipsthispart
Slide47/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Limitations:independentcycles
• Logicallyindependentcycles:- 𝑎, 𝑐, 𝑏- 𝑎, 𝑏
• Independentcycleisignoredduetominimizationprinciple• OneusefulcycleisbetterJ
Slide48/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Limitations:singlethreadedandguardedcycles
• Singlethreadedcycle
Lock a, b
1 a.lock()2 b.lock()3 unlock(a, b)
4 b.lock()5 a.lock()6 unlock(a, b)
Slide49/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Limitations:singlethreadedandguardedcycles
• GuardedcycleThread 1 Thread 2
1 g.lock()2 a.lock()3 b.lock()4 unlock(a, b)5 g.unlock()
6 g.lock()7 b.lock()8 a.lock()9 unlock(a, b)10 g.unlock()
Slide50/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Limitations:singlethreadedandguardedcycles
• Theyarestilllockhierarchyviolation• Suchpotentialdeadlockmaybecomepossibleaftercoderefactoring
Slide51/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Dl-Check
• Implementedasjavaagent- java -javaagent:dlcheck.jar -jar your_app.jar
- CanbeusedwithJunit: -Ddlcheck.fail=true
• Insertsanalysiscodeintoclassesatrun-time
Slide53/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Dl-Checkoutputexample==========================!!! Potential deadlock !!!==========================### Cycle in lock graph: ###Lock ReentrantLock@75915908 was acquired at:
com/intellij/ide/util/treeView/AbstractTreeUi.acquireLock(AbstractTreeUi.java:2464)com/intellij/ide/util/treeView/AbstractTreeUi.attemptLock(AbstractTreeUi.java:2460)
Lock ProjectViewTreeUpdater@46e87eab was acquired at:com/intellij/ide/util/treeView/AbstractTreeUpdater.reset(AbstractTreeUpdater.java:415)com/intellij/ide/util/treeView/AbstractTreeUpdater.getUpdateCount(AbstractTreeUpdater.java:344)com/intellij/ide/util/treeView/AbstractTreeUpdater.performUpdate(AbstractTreeUpdater.java:242)com/intellij/ide/util/treeView/AbstractTreeUpdater.isEnqueuedToUpdate(AbstractTreeUpdater.java:380)com/intellij/ide/util/treeView/AbstractTreeUpdater.cancelAllRequests(AbstractTreeUpdater.java:326)
### Current lock stack: ###Lock Object@5cbe2bca was acquired at:
com/intellij/openapi/application/impl/LaterInvocator$FlushQueue.a(LaterInvocator.java:320)Lock ReentrantLock@75915908 was acquired at:
com/intellij/ide/util/treeView/AbstractTreeUi.acquireLock(AbstractTreeUi.java:2464)com/intellij/ide/util/treeView/AbstractTreeUi.attemptLock(AbstractTreeUi.java:2460)
### Current stacktrace: ###com.intellij.ide.util.treeView.AbstractTreeUpdater.cancelAllRequests(AbstractTreeUpdater.java:326)com.intellij.ide.util.treeView.AbstractTreeUi.releaseNow(AbstractTreeUi.java:457)com.intellij.ide.util.treeView.AbstractTreeUi.access$1400(AbstractTreeUi.java:66)com.intellij.ide.util.treeView.AbstractTreeUi$12.perform(AbstractTreeUi.java:438)...
Slide54/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Byte-codeinstrumentation
• Captureslockacquireandreleaseoperations:- AfterMONITORENTER andbeforeMONITOREXIT instructions- Atthebeginningandtheendofsynchronizedmethod- java.util.concurrent.locks.Lock• Afterlockmethod• AftersuccessfultryLockmethodinvocation• Beforeunlockmethod
Slide55/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Scalability
• MNRalgorithmisNOT concurrent• Read-writelock- Readlockforread-onlyoperationsandcurrentnodemodification- Writelockfortopologicalordermodification- SWMR(single-writermulti-reader)datastructures
Slide56/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Memorymanagement
• JavahasaGarbageCollector• OldlockinstancesandnodesshouldbecollectedbyGC• WeakReference isusedforinternaldatastructures
Slide57/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Benchmarks
• SpecJVM2008:ApacheDerby(4and40threads)• DaCapo:ApacheLucene• DaCapo:Bankingapplication• Fine-Grained(10threads,100and10’000locks)- Liketransfer(from, to, amount) fromexamples
• …
Slide59/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Memoryusageimpact
11,07 1,06
1
1,61
1,34
0,61
1,22
1 1
0,74
1,12
1,35
1
0
0,2
0,4
0,6
0,8
1
1,2
1,4
1,6
1,8
2
Derby1 Derby2 Lucene Bank FG1 FG2
INCR
EASEFA
CTOR
Dl-Check Jcarder MulticoreSDK
Slide60/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Performanceimpact
1,53 1,76
1,03
2,6
4,29
18,05
9,7
128,2
1,25
2,6
7,3
120,71
40,33
3,25
1
2
4
8
16
32
64
128
Derby1 Derby2 Lucene Bank FG1 FG2
SLOWDO
WNFA
CTOR
Dl-Check Jcarder MulticoreSDK
Slide61/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Summary
• Algorithmtodetectpotentialdeadlocksatrun-time• Dl-Check toolhasbeenimplemented• https://github.com/Devexperts/dlcheck• Futurework:- Lockgroupingfeature- Contractstodescribelockacquisitionrules
Slide63/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Dl-Check:dynamicpotentialdeadlockdetectiontoolforJavaprograms
NikitaKoval1,2 DmitryTsitelov2 RomanElizarov2
1ITMOUniversity,ComputerTechnologyDepartment,St.Petersburg,[email protected]
2Devexperts,LLC,St.Petersburg,Russia,
TMPAConference,March2017
Topologicalorder:extra• Canbemaintainedinasingleiterationincasenocyclesareformed• Alreadyacquiredlocksareorderedalready• Edgefromtherightestnodeshouldbeused
Slide66/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
...1 a.lock()2 b.lock()3 c.lock()
...Topologicalorder
Topologicalorder:example(0)void transfer(Account from,
Account to,int amount) {
from.lock()to.lock()// Do transferunlock(from, to)
}
1 transfer(d, b)2 transfer(d, c)3 transfer(c, d)4 transfer(e, a)5 transfer(b, a)
Slide67/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Topologicalorder:example(1)void transfer(Account from,
Account to,int amount) {
from.lock()to.lock()// Do transferunlock(from, to)
}
1 transfer(d, b)2 transfer(d, c)3 transfer(c, d)4 transfer(e, a)5 transfer(b, a)
Affectedregion
Slide68/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Topologicalorder:example(2)void transfer(Account from,
Account to,int amount) {
from.lock()to.lock()// Do transferunlock(from, to)
}
1 transfer(d, b)2 transfer(d, c)3 transfer(c, d)4 transfer(e, a)5 transfer(b, a)
Affectedregion
Slide69/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Topologicalorder:example(3)void transfer(Account from,
Account to,int amount) {
from.lock()to.lock()// Do transferunlock(from, to)
}
1 transfer(d, b)2 transfer(d, c)3 transfer(c, d)4 transfer(e, a)5 transfer(b, a)
Affectedregion
Slide70/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.
Topologicalorder:example(4)void transfer(Account from,
Account to,int amount) {
from.lock()to.lock()// Do transferunlock(from, to)
}
1 transfer(d, b)2 transfer(d, c)3 transfer(c, d)4 transfer(e, a)5 transfer(b, a)
Affectedregion
Slide71/65. Copyright©2017.DevexpertsLLC.Allrightsreserved.