Java并发编程七 CAS自旋锁

拟墨画扇 提交于 2020-08-07 21:36:18
public class CASLockUtil {
    public static AtomicReference casLock = new AtomicReference<Thread>();

    /**
     * 加锁
     * @param waitMillis 重试时间,如果超过这个时间则放弃当前的锁Millis
     * @return
     */
    public  static boolean lock(long waitMillis){
        long end = System.currentTimeMillis()+waitMillis;
        boolean  isLock = casLock.compareAndSet(null,Thread.currentThread());
        while (!isLock&&end> System.currentTimeMillis()){
            isLock = casLock.compareAndSet(null,Thread.currentThread());
        }
        //如果是0就无限尝试
        while (waitMillis==0&&!isLock){
            isLock = casLock.compareAndSet(null,Thread.currentThread());
        }

        return isLock;
    }

    /**
     *  //解锁
     * @return
     */
    public  static boolean unLock(){
        boolean  isLock = casLock.compareAndSet(Thread.currentThread(),null);
        return isLock;
    }

    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    boolean isLock =   CASLockUtil.lock(1000);
                    if(isLock){
                        System.out.println("线程1拿到锁休眠10秒");
                        Thread.sleep(10000);
                    }else {
                        System.out.println("线程1没有拿到锁");
                    }

                }catch (Exception e){

                }finally {
                    CASLockUtil.unLock();
                }

            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    boolean isLock =   CASLockUtil.lock(0);
                    if(isLock){
                        System.out.println("线程2拿到锁休眠10秒");
                        Thread.sleep(10000);
                    }else {
                        System.out.println("线程2没有拿到锁");
                    }

                }catch (Exception e){


                }finally {
                    CASLockUtil.unLock();
                }

            }
        }).start();
    }

}

利用AtomicReference的compareAndSet对当前线程对象进行加锁。测试结果

线程1拿到锁休眠10秒
线程2拿到锁休眠10秒

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!