自旋锁理论知识与代码验证

本文探讨了自旋锁的理论基础,重点介绍了Java中的Atomic类如何利用自旋锁实现原子操作,并通过代码实例演示了自旋锁在多线程环境中的工作原理和性能影响。读者将理解自旋锁与互斥锁的区别,以及何时选择使用自旋锁来优化并发性能。
摘要由CSDN通过智能技术生成

自旋锁理论知识与代码验证

自旋锁

相对互斥锁,自旋锁是一种轻量级的锁,通过循环判断当前锁是否被其他线程获取,直到该线程获取到锁,才退出循环。自旋锁的优点是减少了线程上下文切换的消耗, 缺点是如果获取锁的线程一直处于活跃状态,则会占用大量的CPU资源消耗。

如JAVA中Atomic原子类就是用自旋锁的思想,以轻量级锁的方式实现原子性。

    public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

        return var5;
    }

自旋锁用JAVA代码进行验证

public class SpinLock {

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

 /**
  * @author: dongchao
  * @create: 2021/3/22-10:45
  * @description: 进行加CAS自旋
  * @param:
  * @return:
  */
 public void addLock(){
     Thread thread = Thread.currentThread();
     while (!atomicReference.compareAndSet(null,thread)){
         //直到对比成功 ,即想到于获取到锁,开始执行业务操作
     }
     System.out.println(thread.getName()+"获取到锁!");
 }

 /**
  * @author: dongchao
  * @create: 2021/3/22-10:45
  * @description: 解锁
  * @param:
  * @return:
  */
 public void unLock(){
     Thread thread = Thread.currentThread();
     System.out.println(thread.getName()+"获取释放锁!");
     atomicReference.compareAndSet(thread,null);
 }

 public static void main(String[] args) {
     SpinLock spinLock = new SpinLock();

     Thread thread1 = new Thread(() -> {
         spinLock.addLock();
         try {
             Thread.sleep(4000);
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
         spinLock.unLock();
     },"thread1");
     thread1.start();


     Thread thread2 = new Thread(() -> {
         spinLock.addLock();
         try {
             Thread.sleep(1);
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
         spinLock.unLock();
     },"thread2");

     thread2.start();
 }
}

将Thread1线程Sleep 4s ,即4s后Thread1才会释放锁,即这样线程Thread2需要在While循环不断的判断compareAndSet 4秒后才能获取到锁。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值