パッケージcom.test; 輸入java.util.concurrent.atomic.AtomicReference; 輸入java.util.concurrent.locks.Lock; 輸入java.util.concurrent.locks.ReentrantLock; / ** *手动写一个自旋锁 * @author renyahui * * / パブリック クラスSelfCircleLock { // 原子引用线程 AtomicReference <スレッド> atomicReference = 新しい AtomicReference <スレッド> (); 公共 ボイドmyLock(){ スレッドスレッド = にThread.currentThread()。 System.out.println(thread.getName() + "\トンで来る......"); しばらく(atomicReference.compareAndSet(!ヌル、スレッド)){ // するSystem.out.println( "加锁自我旋转中......"); } } 公共 ボイドmyUnLock(){ スレッドスレッド = にThread.currentThread()。 System.out.println(thread.getName() + "\トン呼び出しmyunlock ......" ); 一方、(!atomicReference.compareAndSet(スレッド、NULL )){ するSystem.out.println( "解锁自我旋转中..." )。 } } パブリック 静的 ボイドメイン(文字列[]引数){ ファイナルSelfCircleLock selfCircle = 新しいSelfCircleLock(); 新しいスレッド( 新しいRunnableを(){ 公共 空ラン(){ selfCircle.myLock(); 試み{ のThread.sleep( 5000 ); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } selfCircle.myUnLock(); } })。開始(); してみてください{ のThread.sleep( 1000 ); } キャッチ(InterruptedExceptionあるE1){ // TODO自動生成されたcatchブロック e1.printStackTrace()。 } 新しいスレッド( 新しいRunnableを(){ 公共 空ラン(){ selfCircle.myLock(); 試み{ のThread.sleep( 1000年); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } selfCircle.myUnLock(); } 。}))(開始。 } }