自定义实现CAS自旋锁

自定义实现CAS自旋锁

本篇文章利用原子引用类自定义实现的自旋锁
new 一个原子引用类,对象类型为Thread

AtomicReference<Thread> atomicReference = new AtomicReference<>();

加锁方法,通过while不断自旋,设置当前线程

public void MyCASLock(){
        System.out.println(Thread.currentThread().getName()+"尝试获取锁!");
        while (!atomicReference.compareAndSet(null,Thread.currentThread())){
//            System.out.println(Thread.currentThread().getName()+"尝试中!");
        }
        System.out.println(Thread.currentThread().getName()+"获取锁成功!");

    }

解锁方法,直接把线程设置为空

public void MyCASUnLock(){
        atomicReference.compareAndSet(Thread.currentThread(),null);
        System.out.println(Thread.currentThread().getName()+"解锁!");
    }

用三个线程测试

AQSTest aqsTest = new AQSTest();
        new Thread(()->{
            aqsTest.MyCASLock();
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("AAA执行中");
            aqsTest.MyCASUnLock();

        },"AAA").start();

        new Thread(()->{
            aqsTest.MyCASLock();
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("BBB执行中");
            aqsTest.MyCASUnLock();

        },"BBB").start();

        new Thread(()->{
            aqsTest.MyCASLock();
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("CCC执行中");
            aqsTest.MyCASUnLock();

        },"CCC").start();

结果

AAA尝试获取锁!
AAA获取锁成功!
BBB尝试获取锁!
CCC尝试获取锁!
AAA执行中
AAA解锁!
CCC获取锁成功!
CCC执行中
CCC解锁!
BBB获取锁成功!
BBB执行中
BBB解锁!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值