手动实现自旋锁

package com.test;

import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
 * 手动写一个自旋锁
 * @author renyahui
 *
 */
public class SelfCircleLock {
    //原子引用线程
    AtomicReference<Thread> atomicReference=new AtomicReference<Thread>(); 
    
    public void myLock(){
        Thread thread=Thread.currentThread();
        System.out.println(thread.getName()+"\t come in……");
        while(!atomicReference.compareAndSet(null, thread)){
            //System.out.println("加锁自我旋转中……");
        }
        
    }
    
    public void myUnLock(){
        Thread thread=Thread.currentThread();
        System.out.println(thread.getName()+"\t  invoke myunlock……");
        while(!atomicReference.compareAndSet(thread, null)){
            System.out.println("解锁自我旋转中……");
        }
        
        
    }

public static void main(String[] args) {
    final SelfCircleLock selfCircle=new SelfCircleLock();
    
    new Thread(
         new Runnable() {
            
            public void run() {
                selfCircle.myLock();
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                selfCircle.myUnLock();
            }
        
    }).start();
    
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    
    new Thread(
             new Runnable() {
                
                public void run() {
                    selfCircle.myLock();
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    selfCircle.myUnLock();
                }
            
        }).start();

}
}

 

posted @ 2020-02-28 01:44  valar-dohaeris  阅读(236)  评论(0编辑  收藏  举报