package Ġm ary k . lib Ċ Ċ import Ġkotlin . native . concurrent . Atomic Reference Ċ import Ġkotlin . native . concurrent . freeze Ċ import Ġkotlin . native . concurrent . is Frozen Ċ Ċ actual Ġfun Ġ< T > Ġsafe Lazy ( initializer : ĠUnit . () Ġ-> ĠT ): ĠLazy < T > Ġ= ĠSafe Lazy Impl ( initializer ) Ċ Ċ /** ĠAn Ġimplementation Ġfor Ġsafe Ġsetting Ġof Ġlazy Ġvalues Ġby Ġa ĠUnit Ġscoped Ġinitializer . Ġ*/ Ċ internal Ġclass ĠSafe Lazy Impl < out ĠT >( ĊĠĠĠ Ġinitializer : ĠUnit . () Ġ-> ĠT Ċ ) Ġ: ĠLazy < T > Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġ_ value : ĠAtomic Reference < Any ?> Ġ= ĠAtomic Reference ( UN INITIAL IZED ) ĊĠĠĠ Ġprivate Ġvar Ġ_ initializer : Ġ( Unit . () Ġ-> ĠT )? Ġ= Ġinitializer ĊĊĠĠĠ Ġoverride Ġval Ġvalue : ĠT ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult : ĠAny ? Ġ= Ġ_ value . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!== ĠUN INITIAL IZED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġ_ initializer !! ( Unit ). freeze () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!_ initializer . is Frozen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ initializer Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this ._ value . compare AndSet ( UN INITIAL IZED , Ġresult )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ value . value Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġoperation Ġon Ġshared Ġobjects Ġmay Ġreturn Ġvalue Ġwhich Ġis Ġno Ġlonger Ġreflect Ġthe Ġcurrent Ġstate Ġof Ġlazy . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġis Initialized (): ĠBoolean Ġ= Ġ(_ value . value Ġ!== ĠUN INITIAL IZED ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġif Ġ( isInitialized ()) ĊĠĠĠĠĠĠĠ Ġvalue . toString () Ġelse Ġ" Lazy Ġvalue Ġnot Ġinitialized Ġyet ." Ċ } Ċ Ċ internal Ġobject ĠUN INITIAL IZED Ġ{ ĊĠĠĠ Ġ// ĠSo Ġthat Ġsingle - threaded Ġconfigs Ġcan Ġuse Ġthose Ġas Ġwell . ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġfreeze () ĊĠĠĠ Ġ} Ċ } Ċ