package Ġcn . t urs om . core . coroutine . lock Ċ Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ Ċ @ Suppress (" Member Visibility Can Be Private ") Ċ class ĠAsync Write First RW Lock ( val Ġdelay Time : ĠLong Ġ= Ġ 1 0 ) Ġ: ĠAsync RW Lock Ġ{ ĊĊĠ Ġprivate Ġval Ġlock Ġ= ĠAtomic Boolean ( false ) ĊĠ Ġprivate Ġval Ġread Number Ġ= ĠAtomicInteger ( 0 ) ĊĠ Ġprivate Ġval Ġwrite Number Ġ= ĠAtomicInteger ( 0 ) ĊĊĠ Ġoverride Ġsuspend Ġfun Ġ< T > Ġdo Write ( block : Ġsuspend Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠ Ġreturn Ġinvoke ( block ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġ< T > Ġdo Read ( block : Ġsuspend Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠ Ġ// Ġ åħĪ çŃīå¾ħ éĢļçŁ¥ éĶģ åħ³éĹŃ ĊĠĠĠ Ġwrite Number . wait ( delay Time ) ĊĊĠĠĠ Ġ// Ġæ·»åĬł è¯» è®¡ æķ° ĊĠĠĠ Ġread Number . increment AndGet () ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġreturn Ġblock () ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠ Ġ// Ġ åĩı å°ĳ è¯» è®¡ æķ° ĊĠĠĠĠĠ Ġread Number . decrement AndGet () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġsync ( block : Ġsuspend Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġinvoke ( block ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġ< T > Ġinvoke ( block : Ġsuspend Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠ Ġwrite Number . increment AndGet () ĊĊĠĠĠ Ġrepeat ( 2 0 ) Ġ{} ĊĊĠĠĠ Ġread Number . wait ( delay Time ) ĊĊĠĠĠ Ġlock . lock ( delay Time ) ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġreturn Ġblock () ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠ Ġlock . release () ĊĠĠĠĠĠ Ġwrite Number . decrement AndGet () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġis Lock (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġlock . get () ĊĠ Ġ} Ċ }