自定义实现CAS自旋锁

自定义实现CAS自旋锁

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

AtomicReference 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解锁!

你可能感兴趣的:(java,多线程,并发编程)