锁介绍名词解释&&Lock && synchronized

2023-11-18

一、名词解释

1、乐观锁 VS 悲观锁

乐观锁在Java中是通过使用无锁编程来实现,最常采用的是CAS算法,Java原子类中的递增操作就通过CAS自旋实现的。
cas知识点移步

乐观锁:只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果数据已经被其他线程更新,则会报错或者使用自动重试

悲观锁:悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁

2、自旋锁 VS 适应性自旋锁

-XX:+UseSpinning来开启,XX:PreBlockSpin来设置自旋次数;
JDK 6中变为默认开启,并且引入了自适应的自旋锁(适应性自旋锁)也是使用CAS原理

自旋锁:在许多场景中,同步资源的锁定时间很短,为了这一小段时间去切换线程,线程挂起和恢复现场的花费可能会让系统得不偿失。如果物理机器有多个处理器,能够让两个或以上的线程同时并行执行,我们就可以让后面那个请求锁的线程不放弃CPU的执行时间,看看持有锁的线程是否很快就会释放锁。而为了让当前线程“稍等一下”,我们需让当前线程进行自旋,如果在自旋完成后前面锁定同步资源的线程已经释放了锁,那么当前线程就可以不必阻塞而是直接获取同步资源,从而避免切换线程的开销
缺点::自旋等待虽然避免了线程切换的开销,但它要占用处理器时间。如果锁被占用的时间很短,自旋等待的效果就会非常好。反之,如果锁被占用的时间很长,那么自旋的线程只会白浪费处理器资源。所以,自旋等待的时间必须要有一定的限度,如果自旋超过了限定次数(默认是10次,可以使用-XX:PreBlockSpin来更改)没有成功获得锁,就应当挂起线程。
适应性自旋锁:自适应意味着自旋的时间(次数)不再固定,而是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。如果在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在运行中,那么虚拟机就会认为这次自旋也是很有可能再次成功,进而它将允许自旋等待持续相对更长的时间。如果对于某个锁,自旋很少成功获得过,那在以后尝试获取这个锁时将可能省略掉自旋过程,直接阻塞线程,避免浪费处理器资源。

3、 无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁

级别从低到高依次是:无锁、偏向锁、轻量级锁和重量级锁。锁状态只能升级不能降级。
这四个锁都是专门针对synchronized的。
这四个锁都是针对Mark Word的内容:

无锁:无锁没有对资源进行锁定,所有的线程都能访问并修改同一个资源,但同时只有一个线程能修改成功。无锁的特点就是修改操作在循环内进行,线程会不断的尝试修改共享资源。如果没有冲突就修改成功并退出,否则就会继续循环尝试。如果有多个线程修改同一个值,必定会有一个线程能修改成功,而其他修改失败的线程会不断重试直到修改成功

*** 偏向锁***:偏向锁是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁,降低获取锁的代价。在大多数情况下,锁总是由同一线程多次获得,不存在多线程竞争,所以出现了偏向锁。其目标就是在只有一个线程执行同步代码块时能够提高性能。当一个线程访问同步代码块并获取锁时,会在Mark Word里存储锁偏向的线程ID。在线程进入和退出同步块时不再通过CAS操作来加锁和解锁,而是检测Mark Word里是否存储着指向当前线程的偏向锁。引入偏向锁是为了在无多线程竞争的情况下尽量减少不必要的轻量级锁执行路径,因为轻量级锁的获取及释放依赖多次CAS原子指令,而偏向锁只需要在置换ThreadID的时候依赖一次CAS原子指令即可。

偏向锁只有遇到其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放锁,线程不会主动释放偏向锁。偏向锁的撤销,需要等待全局安全点(在这个时间点上没有字节码正在执行),它会首先暂停拥有偏向锁的线程,判断锁对象是否处于被锁定状态。撤销偏向锁后恢复到无锁(标志位为“01”)或轻量级锁(标志位为“00”)的状态。
偏向锁在JDK 6及以后的JVM里是默认启用的。可以通过JVM参数关闭偏向锁:-XX:-UseBiasedLocking=false,关闭之后程序默认会进入轻量级锁状态。

轻量级锁:是指当锁是偏向锁的时候,被另外的线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,从而提高性能。

重量级锁:升级为重量级锁时,锁标志的状态值变为“10”,此时Mark Word中存储的是指向重量级锁的指针,此时等待锁的线程都会进入阻塞状态。

4、 公平锁 VS 非公平锁

公平锁:公平锁是指多个线程按照申请锁的顺序来获取锁,线程直接进入队列中排队,队列中的第一个线程才能获得锁。公平锁的优点是等待锁的线程不会饿死。缺点是整体吞吐效率相对非公平锁要低,等待队列中除第一个线程以外的所有线程都会阻塞,CPU唤醒阻塞线程的开销比非公平锁大
非公平锁:非公平锁是多个线程加锁时直接尝试获取锁,获取不到才会到等待队列的队尾等待。但如果此时锁刚好可用,那么这个线程可以无需阻塞直接获取到锁,所以非公平锁有可能出现后申请锁的线程先获取锁的场景。非公平锁的优点是可以减少唤起线程的开销,整体的吞吐效率高,因为线程有几率不阻塞直接获得锁,CPU不必唤醒所有线程。缺点是处于等待队列中的线程可能会饿死,或者等很久才会获得锁

有句话怎么说的,旱的旱死涝旳涝死,容易出现两极分化

5、 可重入锁 VS 非可重入锁

可重入锁:可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,该线程再进入的内层方法会自动获取锁(前提锁对象得是同一个对象或者class),不会因为之前已经获取过还没释放而阻塞。Java中ReentrantLock和synchronized都是可重入锁,可重入锁的一个优点是可一定程度避免死锁。
非可重入锁:非可重入锁NonReentrantLock容易引起死锁。

6、 独享锁 VS 共享锁

*** 独享锁***:独享锁也叫排他锁,是指该锁一次只能被一个线程所持有。如果线程T对数据A加上排它锁后,则其他线程不能再对A加任何类型的锁。获得排它锁的线程即能读数据又能修改数据。JDK中的synchronized和JUC中Lock的实现类就是互斥锁。
共享锁:共享锁是指该锁可被多个线程所持有。如果线程T对数据A加上共享锁后,则其他线程只能对A再加共享锁,不能加排它锁。获得共享锁的线程只能读数据,不能修改数据。独享锁与共享锁也是通过AQS来实现的,通过实现不同的方法,来实现独享或者共享

二、JAVV锁应用

1、lock

ReentrantLock

//我们使用默认无参构造方法用的是非公平锁的方式。
    public ReentrantLock() {
        sync = new NonfairSync();
    }
//fair为true是公平锁
    public ReentrantLock(boolean fair) {
        sync = fair ? new FairSync() : new NonfairSync();
    }

看具体的原理移步这里,这位小哥写的很清楚.

2、synchronized

3、信号量

是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量VI,然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码段的首末端。确认这些信号量VI引用的是初始创建的信号量。
具体可看

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

锁介绍名词解释&&Lock && synchronized 的相关文章

  • 使用 ProcessBuilder 运行 msys.bat

    我正在尝试使用 ProcessBuilder 在 java 中运行 msys bat 当我使用程序运行 bat 文件时 出现以下错误 找不到 rxvt exe 或 sh exe 二进制文件 正在中止 按任意键继续 这是代码 ProcessB
  • 如何通过无头活动处理静默 SEND 意图

    正如提问的用户所说 Android 上的默认浏览器如何发送 SEND 意图 https stackoverflow com questions 3320930 how does the default browser on android
  • 删除列表视图项目之间的间距

    我正在尝试在 Android 中制作一个包含图像的 ListView 我希望图像在列表中彼此相对 但我似乎无法消除间距 这是我的 listview xml
  • 表“DBNAME.hibernate_sequence”不存在

    我有一个使用 spring data jpa 的 Spring Boot 2 0 1 RELEASE 应用程序
  • Android WebView - 带有经过身份验证的代理

    我目前正在尝试调试围绕 WebView 构建的 Android 应用程序 我负责处理的开发网络环境 不是我的选择 这是 企业 安全决策 是WPA WiFi 代理服务器 代理身份验证 虽然a上的说明以前的答案非常有帮助 https stack
  • JTable 中的格式化字段问题 - Integer 和 Double 之间的差异

    更新 已确认为错误当 columnClass 为 Double 时 JTable 无法将给定对象格式化为 Number 错误 ID 7051636 https bugs java com bugdatabase view bug bug i
  • 通过 jdbc 执行存储过程时获取网关超时

    我正在使用 struts2 框架 它基本上是这样的 ActionClass execute call function in business class which returns an object and store this obj
  • 比 O(n) 更好的范围交集算法?

    范围交集是一个简单但不平凡的问题 已经回答过两次了 查找数字范围交集 https stackoverflow com questions 224878 find number range intersection 比较日期范围 https
  • mapFragment.getMapAsync 处的 NullPointerException

    在解决了与我的标题相关的问题后 我找不到问题的解决方案 我有一个NullPointerException at mapFragment getMapAsync 下面是我的MapActivity code package com exampl
  • 如何在 Apache POI 中获取 Excel 空白单元格值?

    我有一个巨大的 Excel 文件 其中包含大量列 如下所示 Column1 Column2 Column3 Column4 Column5 abc def ghi mno pqr 这是我编写的用于打印这些值的代码 try FileInput
  • 使用 lsof 对“打开的文件过多”进行故障排除

    我有一个在 Linux 上运行的 Java 应用程序 PID 为 25426 运行时lsof p 25426 我注意到 java 25426 uid 420w FIFO 0 8 0t0 273664482 pipe java 25426 u
  • HTML 解析和删除锚标记,同时使用 Jsoup 保留内部 html

    我必须解析一些html并删除锚标记 但我需要保留锚标记的innerHTML 例如 如果我的 html 文本是 String html div p some text a href some link text a p div 现在我可以解析
  • Java HashSet 具有自定义相等标准? [复制]

    这个问题在这里已经有答案了 我一直在寻找类似于 Java TreeSet 在实例化时接收自定义比较器的能力 因此我不需要使用对象的默认相等 和哈希码 标准 我能想到的最接近的方法是将我的对象包装在一个私有的自定义类中 但这看起来很老套 这最
  • 光线追踪三角形

    我正在用java编写一个光线追踪器 并且我能够追踪球体 但我相信我追踪三角形的方式有问题 据我了解 这是基本算法 首先确定射线是否与plane三角形已打开 剪裁所有点 使它们与三角形位于同一平面上 因此xy以平面为例 根据沿着新平面向任意方
  • 有丰富的领域模型示例吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个简单的示例来说明使用富域模型的好处 理想情况下 我想要一个之前和之后的代码列表 应该尽可能
  • 如何在java中将ojalgo稀疏数组存储到文件中?

    我目前有一个 SparseStore 矩阵 我在其中执行大量计数和计算 我想将其存储到文件中 以便以后可以重复使用它 而无需重新执行之前的所有计算 我尝试了 Java 中的基本序列化 ObjectOutputStream outputStr
  • 在 Spring 中以编程方式解析 AliasFor 注释值

    我有一个注释 Target ElementType TYPE Retention RetentionPolicy RUNTIME public interface A Class value 这是在课堂上使用的 B D class publ
  • Android 中的 RoboSpice 库是什么

    我正在尝试了解 android 中的 RoboSpice 库 我在这里看到了在线文档 https github com stephanenicolas robospice wiki Starter Guide 我尝试过什么 我之前研究过使用
  • 如何在jsf页面中嵌入java代码?

    我有 一个名为 LoginBean 的托管 bean 名为 login xhtml 的 JSF 页面 在这个 jsf 页面中 我有一个登录表单 在managebean 内部我有一个loginCheck 函数 public void logi
  • Java邮件,设置回复地址不起作用

    我用java写了一个小的电子邮件发送程序 它有from to and reply to地址 当客户端尝试回复邮件时 应该能够回复reply to地址 目前它不起作用 我的代码如下 File Name SendEmail java impor

随机推荐

  • Selenium Python 教程

    Selenium Python 教程 准备工作 元素定位 控制浏览器操作 Webelement常用方法 鼠标操作 键盘事件 获取断言信息 等待页面加载完成 隐式等待 在不同的窗口和框架之间移动 警告框处理 下拉框选择 文件上传 cookie
  • 网络安全(黑客)自学建议一一附学习路线

    温馨提示 为了避免误入歧途 自学请优先看 网络安全法 下面是一些学习建议 1 多请教有经验的人 切忌钻牛角尖 特别是刚入门的什么都不了解的情况下 可能你花好几天研究的一个东西 人10分钟就能搞定 一定不要做闷葫芦 有问题多问 遇到问题不可怕
  • 机器视觉第二次大作业

    内容 给定图像 消除其中的周期性干扰 以下为处理过程 1 显示图像的傅里叶变换后的频谱和傅里叶变换对数所得的频谱 从图2 可以明显的看出周期性噪声在频谱上的分布 于是在低中高频段上都有分布 但是低 通部分较少 所以考虑使用低通滤波器 此部分
  • java学习笔记13--反射机制与动态代理

    本文地址 http www cnblogs com archimedes p java study note13 html 转载请注明源地址 Java的反射机制 在Java运行时环境中 对于任意一个类 能否知道这个类有哪些属性和方法 对于任
  • StyleGAN2 解释

    本文是 1 的译文 按照作者Connor Shorten 的说法 此博客讨论的是StyleGAN2的诸如weight demodulation path length regularization和去掉progressive growing
  • VS Code Remote基于docker的Python开发环境搭建,ssh免密登录

    win电脑 生产一对公钥与私钥 私钥在win 公钥pub在服务器 ssh keygen 服务器复制私钥和ssh配置 1 root用户进入服务器 cd ssh 复制win电脑上的 ssh id rsa pu到服务器 root ssh 目录下
  • 【const-指针-数组】

    文章目录 const const 数组 const 指针 最后 const const是constant的简写 它是用来定义常量 它限定一个变量不允许被改变 产生静态作用 修饰静态变量 const int a 3 int const a 3
  • ZYNQ 库函数学习之SPI

    SPI是串行外设接口 Serial Peripheral Interface 的缩写 是一种高速的 全双工 同步的通信总线 并且在芯片的管脚上只占用四根线 节约了芯片的管脚 同时为PCB的布局上节省空间 提供方便 正是出于这种简单易用的特性
  • 为了买车,我用Python把某帝给搞采集了。

    上班摸鱼看了2个星期车评 还是一头雾水 选合资还是国产 发动机cvt好还是双离合好 艾瑞泽5 GT动力足 但腰线和前脸让人吐槽 真的可靠吗 国产选长安逸动还是吉利帝豪 标志408出来了 还有艾瑞泽8很漂亮 看会视频吧 同质化严重 讲来将去就
  • 基于51单片机的智能晾衣架的设计与实现(源码+论文)_kaic

    摘要 随着社会和市场的变化 我国经济的快速发展和房地产行业的快速扩张 使得装修家居行业飞速发展 在行业高速发展的同时 消费者家居智能化要求也在日益发展 随着科学技术的进步和电子技术的发展 单片机作为智能控制芯片 越来越多的应用到生活中的个各
  • Verilog实例-AMBA(AHB)协议

    目录 一 简介 1 1 AHB 1 2 signal list 1 3 Bus interconnection 总线互联 1 4 Overview of AMBA AHB operation 1 4 1 Basic transfer 1 4
  • ElasticSearch6.x 基于SpringBoot 实现ElasticSearch的统计查询

    AggregationUtil java 实现elasticsearch 搜索引擎针对指定索引的max 最大值 min 最小值 sum 合计统计 avg 平均值统计 stats 基本统计 extendedStats 高级统计 cardina
  • 常见的笔试题之mysql

    MYSQL篇 mysql版本 5 7 安装文件 mysql installer community 5 7 11 0 msi 1 写出复制表的sql语句 例如employ为原表名 copytb为目标表名 语句如下 1 create tabl
  • ajax定时器怎么写,js定时器怎么写?就是在特定时间执行某段程序

    js定时器怎么写 就是在特定时间执行某段程序 复制代码 代码如下 function var handler function var timer setInterval handler 1000 var clear function cle
  • golang运算与循环等

    一 golang运算符 1 算术运算符 相加 相减 相乘 相除 求余 自增 自减 2 关系运算符 等于 不等于 gt 大于 lt 小于 gt 大于等于 lt 小于等于 3 位运算符 按位与运算符 是双目运算符 其功能是参与运算的两数各对应的
  • tkinter实现页面切换

    tkinter是python标准库的GUI组件 对于一些小脚本 完全够用 但是如果是复杂的逻辑界面 当然是啊pyqt更胜一筹 笔者用过wxpython pysimplegui 代码写完了 在打包的时候都会遇到各种各样的问题 而用tkinte
  • chatgpt赋能python:Python如何获取微信聊天记录:详细教程

    Python如何获取微信聊天记录 详细教程 在当前的数字时代 如何快速 便捷地获取信息是困扰每个人的问题 随着移动互联网的发展 微信成为了人们交流沟通的主要工具之一 在这样的背景下 如何获取微信聊天记录成为了一项非常重要的技能 在某些场合中
  • java与jsp的关系_浅谈servlet与jsp的关系

    servlet是用java语言编写的 是一个java类 主要功能是用来接受 处理客户端的请求 并把处理结果返回到客户端显示 Jsp是servlet发展后期的产物 在没有jsp之前 servlet利用输出流动态生成整个HTML页面 输出内容包
  • 数字人解决方案——实时对话数字人源码与环境配置

    前言 1 从技术角度来看 现在的数字人就是一个缝合怪 把各种技术点都整合在一起 用来实现直播 对话等数字人 技术流程大概如下图 其实最重要的一环应该属于LLM 大型语言模型 LLM相当于一个人的意识 如果没有LLM 这一套完全没有深度 2
  • 锁介绍名词解释&&Lock && synchronized

    各种锁名词解释及应用 一 名词解释 1 乐观锁 VS 悲观锁 2 自旋锁 VS 适应性自旋锁 3 无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁 4 公平锁 VS 非公平锁 5 可重入锁 VS 非可重入锁 6 独享锁 VS 共享锁 二