package Ġcom . sk sam uel . kot est . engine . threads Ċ Ċ import Ġio . kot est . core . spec . Isolation Mode Ċ import Ġio . kot est . core . spec . style . Fun Spec Ċ import Ġio . kot est . matchers . shouldBe Ċ import Ġkotlinx . coroutines . delay Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ import Ġjava . util . concurrent . locks . Re entrant Lock Ċ Ċ private Ġval Ġlocked Counter Ġ= ĠAtomicInteger ( 0 ) Ċ private Ġval Ġcounter Before Test Concurrent Ġ= ĠAtomicInteger ( 0 ) Ċ Ċ class ĠSpec Thread Before Test Concurrent Instance Per Leaf Test Ġ: ĠFun Spec ({ ĊĊĠĠ Ġisolation Mode Ġ= ĠI sol ation Mode . Instance Per Leaf ĊĠĠ Ġthreads Ġ= Ġ 3 ĊĊĠĠ Ġval Ġlock Ġ= ĠRe entrant Lock () ĊĊĠĠ Ġbefore Test Ġ{ ĊĠĠĠĠĠ Ġval Ġis Lock Acquire d Ġ= Ġlock . try Lock () ĊĠĠĠĠĠ Ġif Ġ( is Lock Acquire d ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġlock . lock () ĊĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 3 0 0 ) ĊĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . unlock () ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠ Ġlocked Counter . get And Increment () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcounter Before Test Concurrent . get And Increment () ĊĠĠ Ġ} ĊĊĠĠ Ġafter Project Ġ{ ĊĠĠĠĠĠ Ġlocked Counter . get () ĠshouldBe Ġ 0 ĊĠĠĠĠĠ Ġcounter Before Test Concurrent . get () ĠshouldBe Ġ 3 ĊĠĠ Ġ} ĊĊĠĠ Ġtest (" test Ġ 1 Ġshould Ġrun Ġbefore / after Ġtest Ġconcurrent ly Ġand Ġindependent ") Ġ{ ĊĠĠĠĠĠ Ġ" void " ĊĠĠ Ġ} ĊĊĠĠ Ġtest (" test Ġ 2 Ġshould Ġrun Ġbefore / after Ġtest Ġconcurrent ly Ġand Ġindependent ") Ġ{ ĊĠĠĠĠĠ Ġ" void " ĊĠĠ Ġ} ĊĊĠĠ Ġtest (" test Ġ 3 Ġshould Ġrun Ġbefore / after Ġtest Ġconcurrent ly Ġand Ġindependent ") Ġ{ ĊĠĠĠĠĠ Ġ" void " ĊĠĠ Ġ} Ċ }) Ċ