自旋锁的原理实现

2023-05-16


import java.util.concurrent.atomic.AtomicReference;
//boolean compareAndSet(V expect, V update)
//如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值
public class SpinLockDemo implements Runnable{
private static int sum;
private SpinLock spinLock;

public SpinLockDemo(SpinLock spinLock){
this.spinLock = spinLock;
}
@Override
public void run() {
this.spinLock.lock();
sum ++;
this.spinLock.unlock();
}

public static void main(String[] args) throws Exception{
//首先看一个例子 AtomicReference用法
Student st1 = new Student((long)8888);
Student st2 = new Student((long)9999);
AtomicReference ar = new AtomicReference(st1);
//如果ar == st1 ,就更新新值为 st2
Boolean flag = ar.compareAndSet(st1,st2);
System.out.println("更新之后的值" + flag);
Student st3 = (Student) ar.get();
System.out.println("获取更新之后的值:" + st3.getId());
/* 打印结果
更新之后的值true
获取更新之后的值:9999
*/
System.out.println("--------------------------------");
SpinLock lock = new SpinLock();
for(int i=0;i<5;i++){
SpinLockDemo spinLockDemo = new SpinLockDemo(lock);
Thread thread = new Thread(spinLockDemo);
thread.start();
}
Thread.currentThread().sleep(1000);
System.out.println(sum);
/*结论
多次执行结果基本不一样原因是多个线程在未获取到释放之前会一直获取锁
1. 自旋锁的缺陷 会造成死锁和CPU过高 比如如果不加sum<100,可能会造成死锁
2. 自旋锁的实现基于共享变量。一个线程通过给共享变量设置一个值来获取锁,
其他等待线程查询共享变量是否为0来确定锁是否可用,然后再等待循环中自旋直到锁可用为止
个人感觉 对于锁时间短的可以用自旋锁,毕竟效率原高于互斥锁。而对于线程睡眠时间长的用互斥锁
*/
}
}

//定义一个自选锁类
class SpinLock{
//AtomicReference java 13个原子操作的引用操作 线程安全
//不足之处 当前线程对象获得当前数据后,准备修改为新值前,对象的值被其他线程修改了两次,经过
//两次修改之后对象的值恢复为旧值,当前线程无法正确判断这个对象究竟是否被修改过
AtomicReference<Thread> atomicReference = new AtomicReference<>();
//初始化对象的话 预测原来的值就会不为空
//AtomicReference atomicReference = new AtomicReference(Thread.currentThread());
private int sum;
private volatile int unsum;

public void lock(){
Thread curThread = Thread.currentThread();
//lock将atomicReference设置为当前线程,并预测原来的值为空
//如果有新线程调用lock,由于atomicReference的值不为空,新线程会一直循环获取,直到当前线程调用unlock
Boolean flag = atomicReference.compareAndSet(null,curThread);
System.out.println("当前线程比较之后的结果 " + flag);
//第一次调用 当前值为空,所以flag为true
while (!flag && sum < 100){
sum ++;
System.out.println("当前线程被加锁" + sum);

}
}
//unlock将atomicReference设置为null,并预测值为当前线程
public void unlock(){
++ unsum;
System.out.println("当前线程被释放" + unsum);
Thread curThread = Thread.currentThread();
atomicReference.compareAndSet(curThread,null);
}
}

class Student{
volatile long id;

public Student(Long id){
this.id = id;
}
public long getId() {
return id;
}
//编程技巧 对于未引用的对象属性,尽可能的减少
/*public void setId(long id) {
this.id = id;
}*/

@Override
public String toString() {
return "Student{" +
"id=" + id +
'}';
}
}

转载于:https://www.cnblogs.com/mutong1228/p/10543909.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自旋锁的原理实现 的相关文章

  • C语言真正的编译过程

    说实话 xff0c 很多人做了很久的C C 43 43 也用了很多IDE xff0c 但是对于可执行程序的底层生成一片茫然 xff0c 这无疑是一种悲哀 xff0c 可以想象到大公司面试正好被问到这样的问题 xff0c 有多悲催不言而喻 x
  • Docker 删除&清理镜像

    文章首发自个人网站 xff1a https www exception site docker docker delete image 本文中 xff0c 您将学习 Docker 如何删除及清理镜像 xff1f 一 通过标签删除镜像 通过如
  • 解决:invalid application of `sizeof' to incomplete type `({anonymous})'错误

    这个错误的原因 xff1a sizeof不能用在extern变量 xff0c sizeof 的计算发生在代码编译 的时刻 extern 标注的符号 在链接的时刻解析 所以 sizeof 不知道 这个符号到底占用了多少空间 发生错误的程序是这
  • 自制吸锡带

    焊接qfp封装芯片的时候 xff0c 由于两个引脚间距过小 xff0c 常常会在引脚上留有焊锡 xff0c 这个时候就需要吸锡带 xff0c 但是一般情况下我们手边的设备并不齐全 xff0c 所以我们可以利用手边的工具自制 工具 xff1a
  • 实验六

    芯片派生 include lt iostream gt using namespace std class Base public void add int x int y cout lt lt x lt lt 34 43 34 lt lt
  • geometry_msgs.msg.PoseStamped 代码示例

    https programtalk com python examples geometry msgs msg PoseStamped 转载于 https www cnblogs com sea stream p 11129929 html
  • ubuntu 执行apt-get update报错Failed to fetch

    在ubuntu下执行sudo apt get update时 xff0c 经常会遇到报错 xff1a Err http security ubuntu com precise security InReleaseErr http secur
  • github中的wiki是干嘛的_在 Hyperf 框架中,如何定制 gen:model 命令

    Hyperf v2 0 版本中 xff0c 会将 decimal 转化为 float xff0c 从而存在精度丢失的风险 如果直接修改这个问题 xff0c 可能会导致 v2 0 出现 BC xff0c 所以我们在 v2 1 中得到了处理 x
  • APM飞控修改数传模块方法

    APM飞控修改数传模块方法 硬件 ARDUCOPTER第二代数传模块 USB接口 数传模块 telem接口 usb ttl模块 修改方法 注意 xff1a APM固件版本和数传模块估计版本是分开的 xff0c 但有一定的对应关系 xff0c
  • HTTP AUTH 那些事

    谨以此文献给那些需要实现HTTP AUTH的 程序猿 们 关于HTTP AUTH的文档不多 RFC在 http www ietf org rfc rfc2617 txt wiki在 http en wikipedia org wiki Ba
  • 基于超声波的四轴定高控制简析

    笔者是来自武汉理工的小青同学 xff0c 接下来为大家讲一下基于超声波的定高问题 xff0c 鉴于笔者能力有限 xff0c 所以如有错误请多指教 xff0c 且很多仅仅是工程上的近似化应用 xff0c 没有做过仿真模拟 我讲的东西更加偏重于
  • Android 新建工程 卡在Gradle:Resolve dependencies':app:_debugCompile'

    今天更新 androidSDK 到 5 0 xff0c 发现新建工程时卡在 Gradle Resolvedependencies 39 app debugCompile 39 首先 xff0c googledevelop是访问不了的 xff
  • 数学公式

    一 泰勒公式 数学中 xff0c 泰勒公式是一个用函数在某点的信息描述其附近取值的公式 如果函数足够平滑的话 xff0c 在已知函数在某一点的各阶导数值的情况之下 xff0c 泰勒公式可以用这些导数值做系数构建一个多项式来近似函数在这一点的
  • python内置方法和属性

    1 del 方法 作用 当使用类名 创建对象时 xff0c 为对象分配完空间后 xff0c 会自动调用 init 方法 xff0c 当对象被从内存中销毁前 xff0c del 方法会被自动调用 应用场景 xff1a init 方法可以重新设
  • Linux行人识别,0.kcf-tracker 机器人跟踪编程,基于opencv的行人检测和 ,当 发现 后自动进行 。 Linux Network 网络 276万源代码下载- www.pudn.co...

    文件名称 0 kcf tracker下载 收藏 5 4 3 2 1 开发工具 Windows Unix 文件大小 95560 KB 上传时间 2017 05 14 下载次数 0 详细说明 xff1a 机器人跟踪编程 xff0c 基于open
  • 【VirtualBox】快照

    一 快照备份 虚拟机系统快照下来 xff0c 以后就可以恢复到快照之前的系统 右上角 gt 虚拟电脑工具 gt 快照 转载于 https www cnblogs com chenxiaomeng p 9497166 html
  • TX2-start 6 CPU kernel-开启高功耗模式

    1 TX2简介 Jetson TX2是由一个GPU和一个CPU集群组成 CPU集群由双核denver2处理器和四核ARM Cortex A57组成 xff0c 通过高性能互连架构连接 拥有 xff16 个CPU核心和一个GPU xff0c
  • 生成正太随机变量

    clc clear close format long syms u v x y u1 u2 u3 u3 u x1 x2 x3 x4 x5 d L int int int int 1 x5 x4 1 x4 x3 1 x3 x2 1 x2 x
  • 【opencv基础】OpenCV installation stuck at [ 98%] Built target opencv_perf_stitching with no error...

    前言 按照官网步骤安装opencv的过程中进行到98 时一直没有继续进行 原因 后台一直在编译运行 xff0c 只需等待即可 xff0c 参考here xff1b well turns out it gets stuck for quite

随机推荐

  • PX4的UORB通信机制

    在Firmware的msg文件夹里面 xff0c 里面有很多 msg结尾的文件 xff0c 这些msg文件在编译的时候可以生成h头文件 xff0c 这些编译过程中生成的头文件一般是保存在build default src module uo
  • ubuntu下安装和更新R语言

    ubuntu 下安装和更新 R 语言 本文主要讲解在 ubuntu 下如何安装和更新 R 语言 将分别介绍什么是 R 语言 xff0c 简单方法安装 R 语言 xff0c 通过更新源来安装或更新 R 语言 xff0c 和安装 R 语言集成开
  • Linux 中各个文件夹的作用

    根目录 包含了几乎所的文件目录 相当于中央系统 进入的最简单方法是 xff1a cd boot 引导程序 xff0c 内核等存放的目录 这个目录 xff0c 包括了在引导过程中所必需的文件 在最开始的启动阶段 xff0c 通过引导程序将内核
  • 转:Fix Bug的五个阶段

    一个非常严重和困难的bug xff0c 能够成就一个饱经沧桑深受压力的有经验的专业程序员的职业生涯 经受这种考验的创伤程度 xff0c 相当你受到了一次严重的身体伤害 xff0c 离婚 xff0c 或是家庭成为的离世 研究人员在研究了计算机
  • 10.app后端选择什么开发语言

    在qq上 xff0c 经常看到有创业团队的创始人一直都招不到技术人员 xff0c 除了项目的因素外 xff0c 很大的原因就是所需要掌握的开发语言偏门 通过阅读本文 xff0c 详细了解选择开发语言的核心原则 xff0c 使各位心里对开发语
  • dell服务器系统开机提示错误解决方法

    DELL 服务器有时会若硬件的改动 xff0c 在开机以后会提示错误信息 信息一般会提示在显示器上 xff0c 以后举出如下信息的解决办法 信息 原因 纠正措施 Alert iDRAC6 not responding Rebooting i
  • 卡尔曼滤波原理

    卡尔曼滤波原理 原文链接 xff1a http www bzarg com p how a kalman filter works in pictures https blog csdn net u010720661 article det
  • 在网络直播中什么叫推流

    参考 xff1a 推流 xff0c 指的是把采集阶段封包好的内容传输到服务器的过程 其实就是将现场的视频信号传到网络的过程 推流 对网络要求比较高 xff0c 如果网络不稳定 xff0c 直播效果就会很差 xff0c 观众观看直播时就会发生
  • Hello, Weka

    转自http dreamhead blogbus com logs 16813833 html Weka xff0c 是一个用Java编写的数据挖掘软件 数据挖掘 xff0c 从字面上来看 xff0c 它是一个从数据中找寻有用信息的过程 x
  • ubuntu基础知识与技巧

    root用户与超级用户的切换 1 sudo i 2 sudo su 3 su root 安装升级 查看软件xxx安装内容 dpkg L xxx 查找软件库中的软件 apt cache search 正则表达式 或 aptitude sear
  • linux多线程编程书籍推荐:linux大牛之路从这几本书開始总结

    linux多线程编程是指基于Linux操作系统下的多线程编程 xff0c 包含多任务程序的设计 xff0c 并发程序设计 网络程序设计 数据共享等 Linux系统下的多线程遵循POSIX线程接口 xff0c 称为pthread 编写Linu
  • Google Tango初学者教程

    Getting Started with the Tango Java API In this tutorial we 39 ll go through setting up your build environment and compi
  • 在虚拟机下运行gazebo,关于vmw_ioctl_command error Invalid argument错误

    开发环境 xff1a windows10 43 vmware player 43 ubuntu14 04 43 ROS indigo 运行 xff1a gazebo 前提条件 xff1a 安装gazebo xff1a sudo apt ge
  • 做杜邦线(假)教程

    好像国外叫 跳线 xff08 jump wire xff09 xff0c 我们叫杜邦线 xff0c 不清楚这个名字的来历 某宝上的杜邦线 xff0c 质量良莠不齐 xff08 如同很多别的不是杜邦线的商品一样 xff09 吃过几次亏后 xf
  • PX4的workqueue

    Workqueue相当于是中断子程序 xff0c 然后在queue的cycle里面要注意 xff0c 不能在cycle函数里面用printf打印 xff0c 在cycle里面printf函数是打印不出来的 也不能在cycle里面用while
  • windows10安装Python环境

    下载Python交互解释器 xff08 俗称 环境 xff09 登录python官网 xff1a www python org 进 入 官 网 首 页 xff0c 选 择 Downlaods 下 面 对 应 的 系 统 版 本 xff08
  • gvim背景配色

    背景 xff08 feihua 重新安装了gvim7 4后 xff08 发现gvim7 3有显示字符的bug便升级了 xff0c 忽然想改一下windows下gvim的外观 xff0c 在看了几个博客 xff0c 却发现无法设置 xff0c
  • Vue路由(vue-router)详细讲解指南

    中文文档 xff1a https router vuejs org zh Vue Router 是 Vue js 官方的路由管理器 它和 Vue js 的核心深度集成 xff0c 让构建单页面应用变得易如反掌 路由实际上就是可以理解为指向
  • Eclipse在点击运行后不能自动保存的解决

    今天在eclipse上写程序调试时 xff0c 发现当我点击运行按键之后 xff0c 并不能在运行前帮我自动保存 xff0c 也就是说每次修改代码之后 xff0c 运行的还是前一次运行之前的代码 xff0c 并不是修改之后的代码 xff0c
  • 自旋锁的原理实现

    import java util concurrent atomic AtomicReference boolean compareAndSet V expect V update 如果当前值 61 61 预期值 xff0c 则以原子方式将