锁之Syncronized(java面经)

在Java中,锁机制是用于管理多线程环境下的资源访问,以确保数据的一致性和完整性。Java提供了多种锁的实现方式,包括但不限于:

锁从宏观上分类,分为悲观锁与乐观锁。

乐观锁: 即读多写少 , 并发的可能性小 , 一般只有更新时检测 别人是否有更新过 , Java中基本都是通过CAS操作,CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。

悲观锁 : 即写多的情况 , 并发的可能性高 , 每次拿数据时,别人都会修改 , java中的悲观锁就是Synchronize、AQS框架下的锁则是先尝试CAS乐观锁去获取锁,获取不到才会转换为悲观锁,如:ReentrantLock。

偏向锁

偏向锁,顾名思义它会偏向于第一个访问锁的线程,如果在运行过程中,同步锁只有一个线程访问,不存在多线程争用的情况,则线程是不需要触发同步的,这种情况下,就会给线程加一个偏向锁。

轻量级锁

轻量级锁是由偏向锁升级来的,偏向锁运行在一个线程进入同步块的情况下,当第二个线程加入锁争用的时候,偏向锁就会升级为轻量级锁;

自旋锁

自旋锁原理非常简单,如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞挂起状态,它们只需要等一等(自旋),等持有锁的线程释放锁后即可立即获取锁,这样就避免用户线程和内核的切换的消耗。

  1. synchronized

    • 关键字: synchronized 是Java语言级别的锁,可以用于修饰方法或代码块。
    • 对象锁: 当synchronized应用于对象的方法或代码块时,锁的是该对象的内部监视器(monitor)。
    • 类锁: 当synchronized应用于静态方法或类的静态代码块时,锁的是类的Class对象。
  2. Lock接口及其实现

    • ReentrantLock: 是java.util.concurrent.locks.Lock接口的一个可重入的实现,提供了比synchronized更灵活的锁操作。
    • ReadWriteLock: 提供读写锁的机制,允许多个读线程同时访问,但写操作是排他的。
    • StampedLock: 一种更高级的锁,提供了乐观读、悲观读、写等操作,可以替代读写锁。
  3. ThreadLocal

    • 不是一种锁,但它可以提供线程隔离的变量副本,从而避免了锁的需求。
  4. 原子类

    • AtomicInteger, AtomicLong, AtomicReference等,内部使用了Unsafe类的CAS操作来实现线程安全的更新。
  5. 并发容器

    • ConcurrentHashMap, CopyOnWriteArrayList等,内部实现了线程安全的并发操作。

讲一下syncronized的底层原理,知道锁升级吗?

synchronized的底层原理

synchronized关键字在JVM层面上是基于监视器锁(monitor)实现的。在HotSpot虚拟机中,监视器锁是由ObjectMonitor对象实现的,每个对象都有一个与之关联的ObjectMonitor对象。当一个线程试图获取锁时,它会尝试获取该对象的ObjectMonitor。如果ObjectMonitor未被其他线程持有,当前线程就会获得锁,并将ObjectMonitor的状态设置为“已锁定”,并将线程的引用存储在ObjectMonitorowner字段中。其他线程将会被阻塞,直到锁被释放。

synchronized有两种使用方式:

  • 作为代码块的一部分,使用显式的锁对象。
  • 作为方法的修饰符,隐式地使用当前对象或类对象作为锁。

锁升级

Java的锁升级机制是指synchronized锁在不同的竞争程度下自动变化其锁的级别,以减少锁带来的开销。锁升级主要包括以下几种状态:

  1. 偏向锁(Biased Locking): 如果锁没有任何竞争,那么线程可以直接获得锁而无需任何同步开销。这是锁的最低级别。
  2. 轻量级锁(Lightweight Locking): 当有竞争时,偏向锁会升级为轻量级锁。轻量级锁使用CPU的CAS操作尝试获取锁。
  3. 重量级锁(Heavyweight Locking): 当轻量级锁争用失败时,会升级为重量级锁,此时会使用操作系统提供的互斥锁(mutex),线程可能会被阻塞。

锁升级的目的是在低竞争情况下使用更轻量的锁,而在高竞争情况下使用更重的锁,以达到平衡锁的性能和资源消耗的目的。锁升级是自动的,由JVM根据锁的竞争程度动态决定。

锁升级过程(偏向锁/轻量级锁/重量级锁)_偏向锁升级为轻量级锁过程-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/40694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据面试题之Flink(1)

目录 Flink架构 Flink的窗口了解哪些,都有什么区别,有哪几种?如何定义? Flink窗口函数,时间语义相关的问题 介绍下Flink的watermark(水位线),watermark需要实现哪个实现类,在何处定义?有什么作用? Flink的…

如何在TikTok上获得更多观看量:12个流量秘诀

TikTok作为热门海外社媒,在跨境出海行业中成为新兴的推广渠道,但你知道如何让你的TikTok赢得更多关注次数吗?如果您正在寻找增加 TikTok 观看次数的方法,接下来这12种策略,你需要一一做好! 1. 在内容中添加…

HQ-SAM

不建议复现

鸿蒙开发设备管理:【@ohos.update (升级)】

升级 说明: 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 升级范围&…

argparse大坑之parser

parser.add_argument(--rate,help"--rate 0.5 means that there is a 50% probability;",typefloat,default0.5)此时用-h输出usage会报错如下: 最后发现是因为parser的help里面出现了%,改了之后就好了。真坑啊!

[AI Kimi] Context Caching 正式公测,推动长文本模型降本 90%

Kimi 的上下文缓存(Context Caching)技术,开启了公测。我们一起来看下。 介绍 上下文缓存(Context Caching)是一种高效的数据管理技术,它允许系统预先存储那些可能会被频繁请求的大量数据或信息。这样&am…

BeautifulSoup 类通过查找方法选取节点

BeautifulSoup 类提供了一些基于 HTML 或 XML 节点树选取节点的方法,其中比较主流 的两个方法是 find() 方法和 find_all() 方法。 find() 方法用于查找符合条件的第一个节点; find_all() 方法用于查找所有符合条件的节点,并以列表的…

深入Spring Boot启动过程:揭秘设计模式与代码优化秘籍

Spring Boot作为一个强大的框架,其简化的配置和快速启动特性深受开发者喜爱。在本篇博客中,我们将深入探讨Spring Boot的启动过程,并分享一些在日常开发中可以参考的实例,包括工厂类的使用、设计模式的应用以及代码优化的技巧。 …

新火种AI|AI搜索挑战百度谷歌,重塑信息检索的市场?

作者:一号 编辑:美美 AI正在颠覆传统的搜索引擎市场。 随着ChatGPT等大型语言模型的火爆,AI搜索技术成为了公众和业界关注的焦点。这些技术不仅能够提供快速、准确的信息检索,还能够通过自然语言处理技术理解用户的复杂查询&am…

typescript2-类的类型

/* 输出 吃饭 游泳 */ []( )继承与多态------------------------------------------------------------------------1. 子类继承父类特征子类 extends 父类2. 当需要父类参数传递时,用子类也可以,这就是多态/* 继承:子类继承父类 多态…

系统级应用锁的实现方法

前言: 应用锁是一种常见的需求, 下面提供一个个人认为还比较完美的解决方法。本篇从两个方面详述应用锁的实现方法。 一. 流程图 二. 实现细节 一.流程图 二. 实现效果及细节

【区块链+基础设施】蜀信链 | FISCO BCOS应用案例

蜀信链是在四川省经济和信息化厅指导下,在四川省区块链行业协会组织下,由全省区块链相关从业与应用机构 共同参与建设和运营的区域性区块链基础设施,通过多方协同,共同打造合作共赢的区块链产业生态。 蜀信链区块链服务生态秉承“…

iiiiiiiiiiiiiiiiiiiiiiiiiio_contexttttttttttttttttttttttttt

https://www.cnblogs.com/bwbfight/p/17594353.html 谈一谈linux下线程池 - 白伟碧一些小心得 - 博客园 (cnblogs.com) 谈一谈linux下线程池 - 白伟碧一些小心得 - 博客园 (cnblogs.com) https://www.cnblogs.com/bwbfight/p/10901574.html 前面的设计,我们对asio…

中序遍历的两种实现——二叉树专题复习

递归实现: /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right)…

改变conda创建虚拟环境时的默认路径(C盘)

①C:\Users\Lenovo 找到C盘中用户目录下的.condarc文件 ②打开.condarc文件后,添加并修改.condarc 中的 env_dirs 环境路径,按顺序第⼀个路径作为默认存储路径,也就是我的E盘(需要你先在E盘中新建文件夹envsE)。修改完…

智能本质:马毅教授对大模型和白盒理论的观点

引言 在人工智能的快速发展中,我们见证了从简单的自动化工具到复杂的智能系统的演变。随着深度学习技术的突破,大模型如GPT系列已经能够执行从文本生成到图像识别等多样化任务。然而,这些模型虽然在功能上取得了显著进展,但其内部…

2024年7月4日 (周四) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键,实现一键唤起、一键隐藏的 Windows 工具,并且支持窗口动态绑定快捷键(无需设置自动实现)。 卸载工具 HiBitUninstaller: Windows上的软件卸载工具 《最终幻想14》画面升级后 著名…

ruoyi实用性美化记录

一、将tab页中操作区的底色变为亮灰色 ruoyi-ui/src/layout/index.vue 中 <app-main/>改为<app-main style"background: #EEE"/> 二、对应的将form加上底色加边角弧度 ruoyi-ui/src/assets/styles/ruoyi.scss .el-form{border-radius: 3px;padding:…

微信小程序毕业设计-球馆预约系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

【vue】实现自动轮播+滚轮控制

前言 有一个无缝轮播+滚轮控制的需求,找了很多的方法发现都没办法完美的实现这种效果。 用原生的js实现不是无缝滚动 用无缝滚动插件实现,发现pc端无法实现滚轮控制 目标 1 实现表格表无缝循环滚动 2 实现滚轮控制表格表数据滚动 3 掌握vue-seamless-scroll使用方式 一些思考…