【java并发系列】java并发之手写自旋锁

大家好,我是walker
一个从文科自学转行的程序员~
爱好编程,偶尔写写编程文章和生活
欢迎关注公众号【I am Walker】,回复“电子书”,就可以获得200多本编程相关电子书哈~
我的gitee:https://gitee.com/shen-chuhao/walker.git 里面很多技术案例!

自旋锁(spinLock)

是指尝试获取锁的线程不会阻塞,而是采用循环的方式获取锁
好处:减少上下文切换的消耗坏处:循环会消耗CPU

案例

package synchronizedTest.spinLock;

import java.util.concurrent.atomic.AtomicReference;

/**
* author:walker
* time: 2022/3/21
* description:  自定义自旋锁
*/
public class SpinLockTest {

    /**
    * 1.AtomicReference和AtomicInteger非常类似,不同之处就在于AtomicInteger是对整数的封装,而AtomicReference则对应普通的对象引用。也就是它可以保证你在修改对象引用时的线程安全性。
     * 2.AtomicReference是作用是对”对象”进行原子操作。 提供了一种读和写都是原子性的对象引用变量。原子意味着多个线程试图改变同一个AtomicReference(例如比较和交换操作)将不会使得AtomicReference处于不一致的状态。
    */
    AtomicReference<Thread> atomicReference=new AtomicReference<>();

    public void lock(){
        Thread thread = Thread.currentThread();
        System.out.println(thread.getName()+"加锁");
        /**
        * CAS:public final boolean compareAndSet(V expect, V update)
         * 如果atomicReference的值等于期待的null,则将结果设置为thread
         * 主要是比较当前的值和期待值,如果一致则修改,否则则不修改
        */

        /**
        * 如果当前的原子引用不等于null,则一直循环,相当于自旋,如果等于null的话,就终止循环,表示锁被人占用
        */
        while(!atomicReference.compareAndSet(null,thread)){
            System.out.println(thread.getName()+"自旋中");
        }
    }

    public void unlock(){
        Thread thread = Thread.currentThread();
        /**
        * 如果原子引用的线程和当前的对象一致,则设置原子引用为null,相当于释放锁
        */
        atomicReference.compareAndSet(thread,null);
        System.out.println(thread.getName()+"释放锁");
    }

    public static void main(String[] args) throws InterruptedException {
        SpinLockTest spinLockTest = new SpinLockTest();
        
        //定义线程A
        new Thread(()->{
            spinLockTest.lock();
            try {
                //这里让线程休眠,但是不让线程释放锁,作用是让线程B进行等待自旋
                Thread.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            spinLockTest.unlock();
        },"线程A").start();


        //定义线程B
        new Thread(()->{
            spinLockTest.lock();
            spinLockTest.unlock();
        },"线程B").start();
    }




}

参考:
高并发编程之AtomicReference讲解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WalkerShen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值