package Ġbit sp ittle . k ross 2 d . core . memory Ċ Ċ import Ġkotlin . jvm . Synchron ized Ċ import Ġkotlin . jvm . Volatile Ċ Ċ /** Ċ Ġ* ĠA Ġsimple , Ġthread - safe Ġreference Ġcounting Ġsolution Ġfor Ġtarget Ġ[ Disposable ] Ġobjects . Ċ Ġ* Ċ Ġ* ĠAfter Ġbeing Ġconstructed Ġwith Ġa Ġcallback Ġthat Ġinstanti ates Ġthe Ġtarget Ġdis posable , Ġcalling Ġ[ inc ] Ċ Ġ* Ġfor Ġthe Ġfirst Ġtime Ġwill Ġtrigger Ġthe Ġinstantiation Ġand Ġregister Ġthe Ġdis posable . ĠL ater , Ġcalling Ċ Ġ* Ġ[ dec ] Ġthe Ġsame Ġamount Ġof Ġtimes Ġthat Ġ[ inc ] Ġwas Ġpreviously Ġcalled Ġwill Ġresult Ġin Ġthe Ġobject Ġbeing Ċ Ġ* Ġreleased Ġand Ġdisposed . ĠIf Ġ[ inc ] Ġis Ġcalled Ġagain Ġat Ġthat Ġpoint , Ġa Ġnew Ġinstance Ġwill Ġbe Ġcreated . Ċ Ġ* Ċ Ġ* ĠUse Ġ[ value ] Ġto Ġquery Ġthe Ġcurrent Ġvalue Ġof Ġthis Ġclass . ĠIt Ġwill Ġbe Ġ` null ` Ġif Ġ[ inc ] Ġwas Ġnot Ġyet Ċ Ġ* Ġcalled Ġ( or Ġ[ dec ] Ġwas Ġcalled Ġan Ġequal Ġnumber Ġof Ġtimes ) Ċ Ġ*/ Ċ class ĠR c < D : ĠDis posable >( private Ġval Ġcreate : Ġ() Ġ-> ĠD ) Ġ{ ĊĠĠĠ Ġvar Ġvalue : ĠD ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġcounter Ġ= Ġ 0 ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġinc () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( counter Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġcreate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ++ counter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġdec () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( counter Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Un balanced Ġref Ġcounting ; Ġdec () Ġcalled Ġmore Ġthan Ġinc () ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ-- counter ĊĊĠĠĠĠĠĠĠ Ġif Ġ( counter Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDis poser . dispose ( value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }