Java实现自定义自旋锁代码实例

 更新时间:2023年10月13日 10:24:14   作者:码农回忆录  
这篇文章主要介绍了Java实现自定义自旋锁代码实例,Java自旋锁是一种线程同步机制,它允许线程在获取锁时不立即阻塞,而是通过循环不断尝试获取锁,直到成功获取为止,自旋锁适用于锁竞争激烈但持有锁的时间很短的情况,需要的朋友可以参考下

自旋锁

1.空轮询实现

  • 此处主要利用while空轮询以及原子包的CAS
package com.gy.spinlock;
import java.util.concurrent.atomic.AtomicInteger;
/**
 * 利用空轮询实现
 */
public class SpinLock01 {
    private AtomicInteger state = new AtomicInteger(0);
    public void lock() {
        while (!state.compareAndSet(0, 1)){
        }
    }
    public void unLock() {
        state.compareAndSet(1, 0);
    }
}

2. sleep提升性能

  • 第一种实现问题比较明显,当我们的线程没有获得锁之前都是空轮询,此时我们可以让没有获取锁的线程停止
package com.gy.spinlock;
import java.util.concurrent.atomic.AtomicInteger;
/**
 * 利用空轮询实现
 */
public class SpinLock01 {
    private AtomicInteger state = new AtomicInteger(0);
    public void lock() {
        while (!state.compareAndSet(0, 1)){
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public void unLock() {
        state.compareAndSet(1, 0);
    }
}

3. Unsafe提升性能

  • 第二种方式虽然能让程序暂停但是sleep的时间是不好控制的,那么这里有没有一种方式可以直接让程序停止知道unlock的时候才被唤醒
  • park方法和unPark方法就能实现这样的功能
  • 此处unLock处不一定就是unPark的线程获得锁
  • 此处加锁解锁是否同一线程并未处理,处理方式只需要记录加锁线程解锁时判断即可
package com.gy.spinlock;
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.LockSupport;
/**
 * 利用空轮询实现
 */
public class SpinLock01 {
    private AtomicInteger state = new AtomicInteger(0);
    private Queue<Thread> queue = new LinkedList();
    public void lock() {
        while (!state.compareAndSet(0, 1)){
            queue.add(Thread.currentThread());
            LockSupport.park();
        }
    }
    public void unLock() {
        state.compareAndSet(1, 0);
        LockSupport.unpark(queue.poll());
    }
}

到此这篇关于Java实现自定义自旋锁代码实例的文章就介绍到这了,更多相关Java自定义自旋锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringCloud中FeignClient自定义配置

    SpringCloud中FeignClient自定义配置

    使用FeignClient时需了解其默认配置机制,通过注入Decoder、Encoder等Bean实现自定义配置,下面就来介绍一下如何使用,感兴趣的可以了解一下
    2025-08-08
  • 从前端视角零搭建并启动若依后端及环境配置

    从前端视角零搭建并启动若依后端及环境配置

    若依是一个适用于企业级应用的后台框架,提供系统管理、日志管理和系统监控等功能,这篇文章主要给大家介绍了如何从前端视角零搭建并启动若依后端及环境配置的相关资料,需要的朋友可以参考下
    2026-05-05
  • Java中旋转PDF页面的三种实现方法指南

    Java中旋转PDF页面的三种实现方法指南

    在处理 PDF 文件时,我们常会遇到页面方向不正确的问题,在 Java 中,我们可以通过程序化方式旋转 PDF 页面,从而避免手动操作,提高处理效率,下面我们就来看看具体实现方法吧
    2026-01-01
  • Java OpenCV图像处理之背景切换

    Java OpenCV图像处理之背景切换

    这篇文章主要介绍了利用Java OpenCV实现图像背景的切换,文中的示例代码讲解详细。对我们学习OpenCV有一定帮助,感兴趣的同学可以了解一下
    2022-01-01
  • Spring Security SecurityContextHolder组件示例说明

    Spring Security SecurityContextHolder组件示例说明

    SpringSecurity的SecurityContextHolder组件是存储当前安全上下文的地方,包括认证用户信息,它支持全局访问、线程局部存储和上下文传播,是SpringSecurity认证和授权的核心,文章通过示例展示了如何访问已认证用户的详细信息、手动设置认证信息以及使用认证信息保护方法
    2024-11-11
  • Springboot项目中单元测试时注入bean失败的解决方案

    Springboot项目中单元测试时注入bean失败的解决方案

    这篇文章主要介绍了Springboot项目中单元测试时注入bean失败的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java基于余弦方法实现的计算相似度算法示例

    Java基于余弦方法实现的计算相似度算法示例

    这篇文章主要介绍了Java基于余弦方法实现的计算相似度算法,简单说明了余弦相似性的概念、原理并结合实例形式分析了java实现余弦相似性算法的相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • SpringBoot实现对Http接口进行监控的代码

    SpringBoot实现对Http接口进行监控的代码

    Spring Boot Actuator是Spring Boot提供的一个模块,用于监控和管理Spring Boot应用程序的运行时信息,本文将介绍一下Spring Boot Actuator以及代码示例,以及如何进行接口请求监控,需要的朋友可以参考下
    2024-07-07
  • java取两个字符串的最大交集

    java取两个字符串的最大交集

    这篇文章主要介绍了java取两个字符串的最大交集的方法,涉及Java对字符串操作的技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • 关于IntelliJ IDEA 打包代码报错的问题

    关于IntelliJ IDEA 打包代码报错的问题

    这篇文章主要介绍了关于IntelliJ IDEA 打包代码报错的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03

最新评论