package Ġcom . effective . android . anchors Ċ Ċ import Ġandroid . os . Handler Ċ import Ġcom . effective . android . anchors . Logger . d Ċ Ċ class ĠLock able Anchor Ġinternal Ġconstructor ( private Ġval Ġhandler : ĠHandler ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġlock Listener : ĠLock Listener ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġlock Id : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġprivate Ġval Ġm Lock Object Ġ= ĠObject () ĊĠĠĠ Ġprivate Ġvar Ġm Release Listener : ĠRelease Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġunlock Ġ= Ġfalse ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¤ĸéĥ¨ çĽĳåĲ¬ ä¸Ĭ éĶģ æĹ¶ æľº ï¼Į åľ¨ çĽĳåĲ¬ åĪ° ä¸Ĭ éĶģ ä¹ĭåĲİ å¤ĦçĲĨ ä¸ļåĬ¡ éĢ»è¾ĳ ï¼Į å¹¶ å®ĮæĪĲ è§£ éĶģ æĪĸèĢħ çł´ åĿ ı éĶģ è¡Įä¸º ãĢĤ ĊĠĠĠĠ Ġ* Ġ@ param Ġlock Listener ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Lock Listener ( lock Listener : ĠLock Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . lock Listener Ġ= Ġlock Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġset Release Listener ( release Listener : ĠRelease Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . m Release Listener Ġ= Ġrelease Listener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġset Target TaskId ( id : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlock Id Ġ= Ġid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġsuccess To Unlock (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġunlock ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è§£ éĶģ ï¼Į ä»»åĬ¡ éĵ¾ åĲİ ç»Ń ä»»åĬ¡ ç»§ç»Ń æī§è¡Į ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġunlock () Ġ{ ĊĠĠĠĠĠĠĠ Ġhandler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd ( Constants . LOCK _ TAG , ĠThread . currentThread (). name Ġ+ Ġ"- Ġunlock ( Ġ" Ġ+ Ġlock Id Ġ+ Ġ" Ġ) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd ( Constants . LOCK _ TAG , Ġ" Continue Ġthe Ġtask Ġchain ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunlock Inner () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġinternal Ġfun Ġunlock Inner () Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( m Lock Object ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunlock Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Lock Object . notify () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Release Listener ?. release () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġinternal Ġfun Ġsm ash Inner () Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( m Lock Object ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunlock Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Lock Object . notify () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Release Listener ?. release () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çł´ åĿ ı éĶģ ï¼Į ä»»åĬ¡ éĵ¾ åĲİ ç»Ń ä»»åĬ¡ æĹłæ³ķ ç»§ç»Ń æī§è¡Į ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsm ash () Ġ{ ĊĠĠĠĠĠĠĠ Ġhandler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd ( Constants . LOCK _ TAG , ĠThread . currentThread (). name Ġ+ Ġ"- Ġsm ash ( Ġ" Ġ+ Ġlock Id Ġ+ Ġ" Ġ) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd ( Constants . LOCK _ TAG , Ġ" Terminate Ġtask Ġchain Ġ! ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsm ash Inner () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġä¸Ĭ éĶģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġlock () Ġ{ ĊĠĠĠĠĠĠĠ Ġd ( Constants . LOCK _ TAG , ĠThread . currentThread (). name Ġ+ Ġ"- Ġlock ( Ġ" Ġ+ Ġlock Id Ġ+ Ġ" Ġ) ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( m Lock Object ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock Listener ?. lock Up () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Lock Object . wait () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠLock Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġlock Up () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠRelease Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġrelease () ĊĠĠĠ Ġ} Ċ Ċ }