ロックはリエントラントを実現することができます

/ ** 
 * @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; 
                通知()。
            }
        } 
    } 
}

  

おすすめ

転載: www.cnblogs.com/wylwyl/p/10991193.html