自旋锁(理论,代码,小总结)

本文介绍了自旋锁的概念,强调其在多线程中如何避免线程上下文切换以提高效率。通过手写一个简单的Java自旋锁实例,展示了自旋锁的加锁和解锁操作,以及其可能带来的CPU资源消耗问题。在实践中,自旋锁适用于锁持有时间短的场景,以减少线程阻塞的时间成本。
摘要由CSDN通过智能技术生成

自旋锁指获取锁的线程不会立即阻塞,而是采用循环的方法去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是消耗CPU
在这里插入图片描述
自旋锁的好处是:线程不会阻塞
自旋锁的坏处是:如果长时间不能获得锁,循环重了后,性能会下降

手写自旋锁

/**
 * 手写自旋锁
 */
public class SpinLock {
    //创建原子引用类型为Thread的对象
    AtomicReference<Thread> threadAtomicReference = new AtomicReference<>();
    //创建自己的加锁
    public void myLock(){
        Thread thread = Thread.currentThread();
        System.out.println(thread.getName()+"======加锁了");
        //如果当前threadAtomicReference还有值,则表示有人还在操作,则会一直循环,到threadAtomicReference为null
        while(!threadAtomicReference.compareAndSet(null,thread)){

        }
    }

    //创建自己的解锁
    public void myUnLock(){
        Thread thread = Thread.currentThread();
        System.out.println(thread.getName()+"======解锁了");
        //只要是用一个线程才能解锁成功
        threadAtomicReference.compareAndSet(thread,null);
    }
    public static void main(String[] args) {
        SpinLock spinLock = new SpinLock();
        new Thread(() ->{
            spinLock.myLock();
            try {TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); }
            spinLock.myUnLock();
        },"t1").start();

        new Thread(() ->{
              spinLock.myLock();
              try {TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); }
              spinLock.myUnLock();
        },"t2").start();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值