首页 > 其他分享 >锁-基础篇

锁-基础篇

时间:2023-12-07 23:11:33浏览次数:29  
标签:synchronized 基础 计数器 线程 偏向 重量级 轻量级

分类

  • 公平锁/非公平锁
  • 可重入锁
  • 独享锁/共享锁
  • 互斥锁/读写锁
  • 乐观锁/悲观锁
  • 分段锁
  • 偏向锁/轻量级锁/重量级锁
  • 自旋锁

synchronized

有锁升级过程

  • 在 JDK1.6 之前, syncronized 是一把重量级的锁
  • 在 JDK1.8 中,其实默认是轻量级锁,但如果设定了 -XX:BiasedLockingStartupDelay = 0 ,
  • 那在对一个 Object 做 syncronized 的时候,会立即上一把偏向锁。当处于偏向锁状态时, markwork 会记录当前线程 ID 。

升级到轻量级锁

当下一个线程参与到偏向锁竞争时,会先判断 markword 中保存的线程 ID 是否与这个线程 ID 相等,如果不相等,会立即撤销偏向锁,升级为轻量级锁。每个线程在自己的线程栈中生成一个 LockRecord ( LR ),然后每个线程通过 CAS (自旋)的操作将锁对象头中的 markwork 设置为指向自己的 LR 的指针,哪个线程设置成功,就意味着获得锁。关于 synchronized 中此时执行的 CAS 操作是通过 native 的调用 HotSpot 中bytecodeInterpreter.cpp 文件 C++ 代码实现的

升级到重量级锁

如果锁竞争加剧(如线程自旋次数或者自旋的线程数超过某阈值, JDK1.6 之后,由 JVM 自己控制该规则),就会升级为重量级锁。此时就会向操作系统申请资源,线程挂起,进入到操作系统内核态的等待队列中,等待操作系统调度,然后映射回用户态。在重量级锁中,由于需要做内核态到用户态的转换,而这个过程中需要消耗较多时间,也就是"重"的原因之一。

可重入

  • synchronized 拥有强制原子性的内部锁机制,是一把可重入锁。因此,在一个线程使用 synchronized 方法时调用该对象另一个 synchronized 方法,即一个线程得到一个对象锁后再次请求该对象锁,是永远可以拿到锁的。
  • 在 Java 中线程获得对象锁的操作是以线程为单位的,而不是以调用为单位的。
  • synchronized 锁的对象头的 markwork 中会记录该锁的线程持有者和计数器,当一个线程请求成功后,JVM 会记下持有锁的线程,并将计数器计为1。此时其他线程请求该锁,则必须等待。
  • 而该持有锁的线程如果再次请求这个锁,就可以再次拿到这个锁,同时计数器会递增。
  • 当线程退出一个 synchronized 方法/块时,计数器会递减,如果计数器为 0 则释放该锁锁。

悲观锁(互斥锁、排他锁)

synchronized 是一把悲观锁(独占锁),当前线程如果获取到锁,会导致其它所有需要锁该的线程等待,一直等待持有锁的线程释放锁才继续进行锁的争抢。

标签:synchronized,基础,计数器,线程,偏向,重量级,轻量级
From: https://www.cnblogs.com/nxjblog/p/17884216.html

相关文章

  • 2023-2024-1 20231402《计算机基础与程序设计》第十一周学习总结
    2023-2024-120231402《计算机基础与程序设计》第十一周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第十一周作业这个作业的目标自学计算机科学概论第15,16章,《C语言程序设计》第10......
  • 前端学习-JavaScript学习-js基础-API02
    学习视频:黑马程序员视频链接事件监听三要素:事件源、事件类型、事件处理程序随机点名案例<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"&......
  • uml基础知识
    Uml常用的9种图可以分为静态图和动态图两种,其中常用的静态图5种,动态图4种,静态图:用例图,类图,包图,对象图,部署图动态图:顺序图,通信图,状态机图,活动图。类图(ClassDiagram)类图是UML中最常用的图之一,用于描述系统中类的结构。它展示了类之间的关系,包括继承、聚合、关联等。类图还可......
  • 2023-2024 20231302《计算机基础与程序设计》第十一周学习总结
    作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第十一周作业这个作业的目标计算机网络、网络拓扑、云计算、网络安全、Web、HTML,CSS,Javascript、XML作业正文https://www.cnblogs.com/9q2z2z......
  • UML各类基础知识总结
    1、UML关系泛化(也就是我们传统意义上的继承关系)子类继承父类,关系用extend关键字标识;关联可以说是一种属于关系,图中即说的是PhoneNumber类属于Master类,同时,除了一对一的关系之外,还可以用一对多、多对一、多对多的关联关系,除了单向关联之外,双向关联也是存在的;需要注意的是,在......
  • 天池AI练习生计划 - 第二期AI数学基础入门与实践,火热进行中!通关赢取双重礼品!
    机器视觉学术研究与产品研发专家雷明,带领您详细学习人工智能领域需要用到的数据知识点,从学习者蜕变为AI新星!轻松来闯关,即可领取双重礼品~实训培训证书:通关两个关卡即可领取阿里云定制长袖T恤:通关全部关卡即可领取活动地址:https://tianchi.aliyun.com/specials/promotion/math......
  • Lucene 查询原基础
    内容收集于知乎,留作学习记录:https://zhuanlan.zhihu.com/p/35814539?spm=ata.21736010.0.0.2b08736byUyj3I前言Lucene是一个基于Java的全文信息检索工具包,目前主流的搜索系统Elasticsearch和solr都是基于lucene的索引和搜索能力进行。想要理解搜索系统的实现原理,就需要深入lu......
  • 天池AI练习生计划 - 第二期AI数学基础入门与实践,火热进行中!通关赢取双重礼品!
    机器视觉学术研究与产品研发专家雷明,带领您详细学习人工智能领域需要用到的数据知识点,从学习者蜕变为AI新星!轻松来闯关,即可领取双重礼品~实训培训证书:通关两个关卡即可领取阿里云定制长袖T恤:通关全部关卡即可领取活动地址:https://tianchi.aliyun.com/specials/promotion/math......
  • UML基础知识总结
    UML(UnifiedModelingLanguage)统一建模语言,又称标准建模语言。是用来对软件密集系统进行可视化建模的一种语言。UML的定义包括UML语义和UML表示法两个元素。UML是在开发阶段,说明、可视化、构建和书写一个面向对象软件密集系统的制品的开放方法。最佳的应用是工程实践,对大规模,复杂......
  • Python基础知识——变量
    Python基础知识——变量2.2变量message="HelloPythonworld"print(message)message="HelloPythonCrashCourseworld!"print(message)mesage="HelloPythonCrashCoursereader"print(mesage)每个变量(variable)指向一个值(value)python始终记......