package Ġcodes . st ev ob rock . android toolbox . concurrency Ċ Ċ import Ġjava . util . concurrent . locks . Re entrant ReadWrite Lock Ċ import Ġkotlin . concurrent . read Ċ import Ġkotlin . concurrent . write Ċ Ċ //---------------------------------------------------------------- ------------------------------------------------ ------ Ċ class ĠLock ing Array HashMap < T , ĠU > Ġ{ ĊĊ ĉ // ĠProperties Ċĉĉ ĉ val ĠisEmpty Ġ: Boolean Ġget () Ġ= Ġthis . lock . read () Ġ{ Ġmap . isEmpty () Ġ} Ċĉĉ ĉ val ĉ all Values Ġ: List < U > Ġget () Ġ= Ċĉĉĉĉ ĉ this . lock . read () Ġ{ Ċĉĉĉĉĉ ĉ // ĠCollect Ġvalues Ċĉĉĉĉĉ ĉ val Ġall Values Ġ= ĠArrayList < U >() Ċĉĉĉĉĉ ĉ map . values . forEach () Ġ{ Ġall Values . addAll ( it ) Ġ} ĊĊĉĉĉĉĉ ĉ return Ġall Values Ċĉĉĉĉ ĉ } ĊĊ ĉ private ĉ val Ġlock Ġ= ĠRe entrant ReadWrite Lock () Ċ ĉ private ĉ val Ġmap Ġ= ĠHashMap < T , ĠArrayList < U >>() ĊĊ ĉ // ĠInstance ĠMethods Ċ ĉ //---------------------------------------------------------------- ------------------------------------------------ -- Ċ ĉ fun Ġadd Array Value ( key Ġ: T , Ġvalue Ġ: U ) Ġ{ Ċĉ ĉ // ĠPerform Ġunder Ġlock Ċĉ ĉ this . lock . write () Ġ{ Ċĉĉ ĉ // ĠCheck Ġif Ġhas Ġexisting Ġarray Ċĉĉ ĉ val ĉ array List Ġ= Ġthis . map [ key ] Ċĉĉ ĉ if Ġ( array List Ġ!= Ġnull ) Ġ{ Ċĉĉĉ ĉ // ĠHave Ġexisting Ġarray Ċĉĉĉ ĉ array List . add ( value ) Ċĉĉĉ ĉ this . map [ key ] Ġ= Ġarray List Ċĉĉ ĉ } Ġelse Ċĉĉĉ ĉ // ĠFirst Ġitem Ċĉĉĉ ĉ this . map [ key ] Ġ= Ġarray ListOf ( value ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ //---------------------------------------------------------------- ------------------------------------------------ -- Ċ ĉ fun Ġvalues ( key Ġ: T ) Ġ: List < U >? Ġ{ Ġreturn Ġthis . lock . read () Ġ{ Ġthis . map [ key ] Ġ} Ġ} Ċ } Ċ