/ ** * @ClassNameロック * @descriptionリエントラントロック * @author管理 * @date 2019年6月8日16時58分 * @Version 1.0 ** / パブリッククラスロック{ falseにブール= isLocked; スレッドlockedBy = NULL; lockedCount = 0のint; / ** *リエントラントは意味:スレッドはそれのいずれかがすでにコードのロック同期ブロックを持って入力することができます * @throws InterruptedExceptionある * / / ** *我々は(2つのスレッドが印刷を呼び出すように設計)メソッドは、最初のスレッドは、ロック()メソッドを入力して、ロックを取得するには、印刷()メソッドを呼び出します *初期lockedByがnullの場合、それがハングに入るものではありませんが、現在のスレッド、 *が、インクリメンタルlockedCountとレコードlockByのため最初のスレッド。そして、最初のスレッドがdoAdd()メソッドが入り、 *により、同じプロセスに、ハング、そしてlockedCountをインクリメントしながら、それは入りませんので、 *ときロックする第二のスレッドを試みisLocked = trueに起因する、ので、彼は得ることはありませんロック、 *直到第一个线程调用两次(アンロック)将LOCKCOUNT递减0为、才将标记为isLocked设置为偽 * @throws InterruptedExceptionあるが * / 公共同期ボイドロック()InterruptedExceptionある{スロー スレッドのスレッド=にThread.currentThreadを(); しばらく(!isLocked && lockedBy =スレッド){ 待機(); } isLocked = TRUE。 lockedCount ++; lockedBy =スレッド。 } パブリック同期ボイドロック解除(){ IF(にThread.currentThread()== this.lockedBy){ lockedCount--。 IF(lockedCount == 0){ isLocked = FALSE; 通知()。 } } } }