首页 > 其他分享 >自旋锁的简单实现

自旋锁的简单实现

时间:2023-07-23 22:57:06浏览次数:32  
标签:currentThread Thread 实现 lock 自旋 线程 简单 new public

实现

自旋锁(spinlock):是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。

自旋锁是互斥锁的一种实现,Java 实现如下方所示。

public class SpinLock {
    private AtomicReference<Thread> owner = new AtomicReference<Thread>();

    public void lock() {
        Thread currentThread = Thread.currentThread();
        // 如果锁未被占用,则设置当前线程为锁的拥有者
        while (!owner.compareAndSet(null, currentThread)) {
        }
    }

    public void unlock() {
        Thread currentThread = Thread.currentThread();
        // 只有锁的拥有者才能释放锁
        owner.compareAndSet(currentThread, null);
    }
}

测试

测试代码如下:

public class SpinLockTest {

    public static class Accumulator implements Runnable {
        SpinLock lock = new SpinLock();
        int i;

        @Override
        public void run() {
            for (int j = 0; j < 10000; j++) {
                lock.lock(); // 加锁
                i++;
                lock.unlock(); // 解锁
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Accumulator accumulator = new Accumulator();
        Thread t1 = new Thread(accumulator);
        Thread t2 = new Thread(accumulator);
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println(accumulator.i); // 预期值 20000
    }
}

输出如下:

20000

Process finished with exit code 0

优缺点

优点:

  • 自旋锁实现简单,同时避免了操作系统进程调度和线程上下文切换的开销。

缺点:

  • 第一个是锁饥饿问题。在锁竞争激烈的情况下,可能存在一个线程一直被其他线程“插队”而一直获取不到锁的情况。
  • 第二是性能问题。在实际的多处理上运行的自旋锁在锁竞争激烈时性能较差。

参考
Java AQS 核心数据结构-CLH 锁

标签:currentThread,Thread,实现,lock,自旋,线程,简单,new,public
From: https://www.cnblogs.com/dalelee/p/17576102.html

相关文章

  • Avalonia中用FluentAvalonia+DialogHost.Avalonia实现界面弹窗和对话框
    Avalonia中用FluentAvalonia+DialogHost.Avalonia实现界面弹窗和对话框本文是项目中关于弹窗界面设计的技术分享,通过FluentAvalonia+DialogHost.Avalonia开源nuget包来实现项目中需要弹框显示的界面和所有的对话框的展示。效果如下:1.项目介绍本项目是基于Avalonia的G......
  • 推荐算法java实现
    推荐算法Java实现1.算法流程下面是实现推荐算法的整体流程:步骤描述1数据准备2特征提取3相似度计算4推荐结果生成2.代码实现2.1数据准备首先,我们需要准备好推荐算法所需的数据。数据可以来自用户行为日志、商品信息等。在这个例子中,我们假设我们......
  • 如何实现多模块分别提交到不同的远程仓库?
    利用图形化界面,在提交推送里找不到新的模块?注意先要初始化新模块的本地仓库,即gitinit(在GUI中不好操作,直接在终端操作即可)之后才能进行其他操作!!!......
  • 初识机器学习及机器学习线性拟合的实现
    从最小二乘法到机器学习1,什么是机器学习?机器学习有下⾯⼏种定义:机器学习是⼀⻔⼈⼯智能的科学,该领域的主要研究对象是⼈⼯智能,特别是如何在经验学习中改善具体算法的性能。机器学习是对能通过经验⾃动改进的计算机算法的研究。机器学习是⽤数据或以往的经验,以此优化计算机程......
  • 1.使用jquery两种方式实现设置页面中的div元素的宽度为200px,高度为200px,背景颜
    使用jQuery两种方式实现设置页面中的div元素的宽度为200px,高度为200px,背景颜色整体流程为了实现这个目标,我们需要按照以下步骤进行操作:引入jQuery库文件使用第一种方式实现设置div元素样式使用第二种方式实现设置div元素样式步骤详解1.引入jQuery库文件首先,我们需要在HT......
  • 代码实现-小样本-RN
    此篇为《LearningtoCompareRelationNetworkforFew-ShotLearning》只实现了基于Omniglot数据集的小样本代码datas为数据集models为训练好的模型venv为配置文件下面的py文件是具体实现代码1.结构2.问题:KeyError:'..\datas\omniglot_resized'报错信息:File"Lea......
  • salesforce 用input 实现currency功能
    最近项目是国内项目定制化要求比较高,所以我们没办法用salesforce提供标签编写代码,遇到了一个currency字段显示问题。下面是我的实现方法。第一个截图输入的是数字,当输入结束后变成金钱显示方式。欢迎沟通交流。  下面是代码CSSbody,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl......
  • echarts记录篇(三 ):使用横向柱状图实现左侧分类对齐右侧显示数据效果及数据过多加滚动
    一、效果如下: 二、直接上代码上一篇已经说过左侧分类,右侧数据对齐的方法,如果需要移步上篇,此篇主要是纵向滚动条功能,代码如下:dataZoom:[{type:"slider",realtime:true,//拖动时,是否实时更新系列的视图startValue:0,endVal......
  • 全连接层对比GCN层实现论分分类
    目录(1)数据预处理(2)全连接层(3)将全连接层替换成GCN层(4)可视化展示本文分别利用全连接层/GCN层实现对2708篇论分(论文之间有引用关系,由此引入图神经网络)进行7分类的任务,通过对比知:利用全连接层的准确率为59%,利用GCN层的准确率为81%(1)数据预处理fromtorch_geometric.datas......
  • echarts记录篇(一):使用柱状图实现排名前边有排序数字
    一、效果如图: 二、直接上代码yAxis:{inverse:true,//如果数据数组倒置排序,加上此代码data:categories1,offset:0,axisLabel:{fontSize:18,color:"#5DB3DC",margin:130,//距离右侧图形距离,配合axisLabel.l......