Java程序员面试必备之深入理解自旋锁_本人秃顶程序员的博客-程序员秘密

技术标签: 面试  Java  程序员  自旋锁  程序人生  

点关注,不迷路;【本人秃顶程序员】持续更新Java架构相关技术及资讯热文!!!

简单回顾一下CAS算法

CAS算法 即compare and swap(比较与交换),是一种有名的无锁算法。无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。CAS算法涉及到三个操作数

  • 需要读写的内存值 V
  • 进行比较的值 A
  • 拟写入的新值 B

当且仅当 V 的值等于 A时,CAS通过原子方式用新值B来更新V的值,否则不会执行任何操作(比较和替换是一个原子操作)。一般情况下是一个自旋操作,即不断的重试。

什么是自旋锁?

自旋锁(AutoGyrationLock):是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。获取锁的线程一直处于活跃状态,但是并没有执行任何有效的任务,使用这种锁会造成busy-waiting。

它是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,”自旋”一词就是因此而得名。

Java如何实现自旋锁?

下面是个简单的例子:

lock()方法利用的CAS,当第一个线程A获取锁的时候,能够成功获取到,不会进入while循环,如果此时线程A没有释放锁,另一个线程B又来获取锁,此时由于不满足CAS,所以就会进入while循环,不断判断是否满足CAS,直到A线程调用unlock方法释放了该锁。

自旋锁存在的问题

  1. 如果某个线程持有锁的时间过长,就会导致其它等待获取锁的线程进入循环等待,消耗CPU。使用不当会造成CPU使用率极高。
  2. 上面Java实现的自旋锁不是公平的,即无法满足等待时间最长的线程优先获取锁。不公平的锁就会存在“线程饥饿”问题。

自旋锁的优点

  1. 自旋锁不会使线程状态发生切换,一直处于用户态,即线程一直都是active的;不会使线程进入阻塞状态,减少了不必要的上下文切换,执
  2. 行速度快
  3. 非自旋锁在获取不到锁的时候会进入阻塞状态,从而进入内核态,当获取到锁的时候需要从内核态恢复,需要线程上下文切换。 (线程被阻塞后便进入内核(Linux)调度状态,这个会导致系统在用户态与内核态之间来回切换,严重影响锁的性能)

点关注,不迷路;【本人秃顶程序员】持续更新Java架构相关技术及资讯热文!!!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44175121/article/details/90408713

智能推荐

网站 nginx http 升级 https_nginx http与https_我有一个抱枕的博客-程序员秘密

首先下载wget -c https://nginx.org/download/nginx-1.10.1.tar.gz

遗传算法的C语言实现(二)_遗传算法c_tyfbhlxd的博客-程序员秘密

上一次我们使用遗传算法求解了一个较为复杂的多元非线性函数的极值问题,也基本了解了遗传算法的实现基本步骤。这一次,我再以经典的TSP问题为例,更加深入地说明遗传算法中选择、交叉、变异等核心步骤的实现。而且这一次解决的是离散型问题,上一次解决的是连续型问题,刚好形成对照。     首先介绍一下TSP问题。TSP(traveling salesman problem,旅行商问题)是典型的NP完全

WebRTC原理解析_JunChow520的博客-程序员秘密

浏览器本身不支持点对点建立信道进行通信,需通过服务器进行中转。因此浏览器之间一次通信需通过两段信道,通信效率同时受制于两段信道宽度,因此并不适合数据流的传输。WebRTC是浏览器实时通信RTC的提供JS接口,JS接口通过信令建立浏览器点对点(peer-to-peer,P2P)的信道,信道可发送任何数据并无需经过服务器。WebRTC提供三个APIMediaStream用于获...

Y U V与Y,Pb,Pr与 Y, Cb,Cr有什么区别?([转载]_pbpr cbcr_欧耶山哥的博客-程序员秘密

从技术上角度区分,颜色空间可考虑分成如下三类: Ø    RGB型颜色空间/计算机图形颜色空间:这类模型主要用于电视机和计算机的颜色显示系统。例如,RGB,HSI, HSL和HSV等颜色空间。Ø    XYZ型颜色空间/CIE颜色空间:这类颜色空间是由国际照明委员会定义的颜色空间,通常作为国际性的颜色空间标准,用作颜色的基本度量方法。例如,CIE 1931 XYZ,L*a*b,L*u*v和

python统计英文单词个数_统计英文单词的个数的python代码 及 字符串分割_weixin_39941732的博客-程序员秘密

字符串分割str="a|and|hello|||ab"alist = str.split('|')print alist结果 str="a hello{这里换成5个空格}world{这里换成3个空格}"alist=str.split(' ')print alist 统计英文单词的个数的python代码# -*- coding: utf-8 -*-import os,sysinfo = os.get...

[从零开始学习FPGA编程-31]:进阶篇 - 基本时序电路-RS触发器(Verilog语言)_verilogrs触发器_文火冰糖的硅基工坊的博客-程序员秘密

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_程序员秘密本文网址:目录前言:第1章 基本RS触发器1.1 概述1.2 RS触发器的电路图组成1.3 /RS触发器的工作原理 1.4 RS触发器的真值表第2章 带时钟信号的同步RS触发器2.1 电路组成2.2 真值表2.3 Verilog代码复位Reset,置位Set是时序电路非常基础的两个功能信号,本文就讲探讨使用者两个基本信号的触发器,RS触发器。复位/置位触发器(R、S分别是英文复位,置位的缩写)也叫做基本R-S触发器,是

随便推点

layui表单校验及监听复选框选中状态的坑_a724848151732208的博客-程序员秘密

试过所有的办法,都没有办法获取到复选框的选中状态,整了一早上,最后忽然想到,难道一定要用layui官方文档提供的方式监听吗,用原生js难道就不行了,最后一试竟然成功了,不得不说,js是最强大的。 1 <div class="myform layui-form"> 2 <input type="text" nam...

skywalking6.0增加elasticsearch6.x的授权(x-pack)_羽&木的博客-程序员秘密

源码包和参考配置:https://download.csdn.net/download/yy19880929/10980231修改内容:增加skywalking连接elasticsearch6.x时x-pack的授权支持,在配置文件中增加了userName和password的配置。...

小群效应-社群运营的底层逻辑_运营官小王的博客-程序员秘密

我们已经从大众化时代进入圈层时代。未来所有的消费,都有可能来自统一价值观圈层的社交。流量打法已成历史,基于用户(用户池)的打法正在崛起,并将统治后续的营销和传播。社交网络是如何释放红利的?任何红利都是容易消失的,唯有基于人性的红利永远存在。1.小群效应用户更愿意分享给强关系好友和小圈子被发觉的大城市聚焦效应。大部分好友与用户的所在地相同,表明用户与大多数好友的地理位置相近。一个社群会分化为多个小社群,本社群内一定有成员协助将更多社群连接起来。这个连接起更多小社群的人(连接者)..

jQuery对底部导航进行跳转并高亮显示_weixin_30708329的博客-程序员秘密

这两天弄一个mui的底部菜单,有点费时了,尝试了用vue写,纯js写,还有根据mui的写,还是有些问题和麻烦。直到看了网上的一些例子,才想明白,之前一直是一种点击触发事件才高亮的思维去做,这个虽然可以了,但是页面跳转了就又都没了。网上看明白的例子是:让当前页面地址与导航里的地址做对比,相同就高亮,之前思维太死,一直以点击才触发事件来写,结果问题好几个。接下来上代码<style>...

Linux fcntl 函数详解_fcntl64_程序猿Ricky的日常干货的博客-程序员秘密

接口#include <fcntl.h>int fcntl(int fd, int cmd, ...);返回值:正确返回值根据命令码而定,错误返回-1。fcntl是用来修改已经打开文件的属性的函数,包含5个功能:复制一个已有文件描述符,功能和dup和dup2相同,对应的cmd:F_DUPFD、F_DUPFD_CLOEXEC。当使用这两个cmd时,需要传入第三个参数...

Web项目【用户管理系统】完整版_web管理系统_爱吃豆的土豆的博客-程序员秘密

UMS查询所有,UMS添加用户,UMS查询用户指定信息,UMS删除指定用户信息,UMS查询详情,UMS编辑用户,UMS用户登录,UMS验证码校验,UMS记住用户名,UMS-MD5校验

推荐文章

热门文章

相关标签