Doneを手動でスピンロック

パッケージ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(); 
                } 
            
        。}))(開始。

} 
}

 

おすすめ

転載: www.cnblogs.com/jiawen010/p/12375530.html