Java面试篇基础部分-Java语言中的锁有哪些?

  Java中的锁主要是用于保障并发线程场景下的数据一致性问题。在多线程编程中为了保证数据一致性,通常需要在使用对象或者方法之前进行加锁操作。也就是说要保证在同一时间内只能由一个线程来对对象进行修改,从而保证了数据一致性,保证了数据安全问题。
在这里插入图片描述
  锁从使用角度上来说可以分为乐观锁和悲观锁,从获取资源的公平性角度上来讲可以分为公平锁和非公平锁,从是否共享资源的角度上来讲可以分为共享锁和独占锁,从锁的状态角度可以分为偏向锁、轻量级锁和重量级锁。

乐观锁

  乐观锁采用了乐观的思想来处理数据,每次读取数据的时候都会认为没有其他人对数据进行修改,所以也就不会上锁,但是在更新的时候会判断是否有人更新过该数据,想要解决这个问题,通常采用的方式就是在写数据的时候先读取出当前的版本号,然后加锁的方式,具体的过程如下

  比较当前版本号与上次的版本号,如果版本号一致,就说明没有更新过,此次就是最新的数据,如果版本号不一致,则进行重复的读写进行比较。

  Java中的乐观锁大部分的场景下是使用CAS(Compare And Swap,比较交换)来实现的,CAS是一种原子更新操作 ,在对数据操作之前首先会比较当前值与传入的值是否一样,如果一样则更新,否则不执行更新操作 ,直接返回失败状态。

悲观锁

  悲观锁采用悲观思想处理数据,也就是说假设在每次读取数据的时候都会认为其他人在修改数据,所以每次在读写数据的时候都会上锁,这样别人想写这个数据的时候就会直接进入到阻塞状态、等待获取到锁。

  Java中的悲观锁大部分的是基于AQS(Abstract Queued Synchronized,抽象的队列同步器)架构来实现。AQS定义了一套多线程访问共享资源的同步架构,许多同步类的实现都依赖于它,例如 Synchroinzed、ReentrantLock、Semaphore、CountDownLatch等等。该框架下的锁首先会尝试一CAS的方式去获取锁,如果获取不到锁,则转换为悲观锁,例如RetreenLock。

自旋锁

  自旋锁:如果持有锁的线程能在很短的时间内释放锁资源,那么这些等待竞争锁的线程就不需要做内核态与用户态之间的切换进入到阻塞、挂起状态,只需要等待一段时间就可以了,也就是自旋。在等待持有锁的线程释放锁之后立即获取到锁,这样就避免了用户线程在内核状态的切换上导致锁的时间消耗。

  线程在自旋时会占用CPU,在线程长时间自旋无法获取到锁,就会导致CPU的浪费,甚至有时线程永远无法获取锁导致CPU资源永远被占用。这个时候就需要设置这个自旋锁的最大自旋时间,有了这个时间以后,如果在这个时间之内没有获取到锁,线程就会退出自旋模式并且释放所持有的锁。

优点

  1、自旋锁在一定程度上减少了CPU上下文之间的切换,可以大幅度的提升锁占用时间短,锁竞争不激烈的代码块的性能。在整个的过程中,CPU耗时是明显少于线程阻塞、挂起、唤醒两次CPU上下文所用的时间。

缺点

  1、如果持有锁的线程占用较长的时间或者获取锁的竞争过于激烈的时候,线程在自旋的过程中会长时间的获取不到资源,导致CPU资源的浪费。所以在有些复杂系统中使用自旋锁的时候要慎重。

  应该如何解决自旋锁的执行时间问题呢?如果自旋锁的执行时间太长了,就会有大量的线程处于自旋状态,占用CPU资源,造成系统资源浪费。所以执行时间的长短设置直接会影响到系统的性能

  JDK在不同的版本中采用了不同的周期,JDK1.5固定DE时间,JDK1.6引入了适应性的自旋锁。适应性的自旋锁自旋时间不是固定的,而是通过上次的时间进行计算得到。可以基本上确定一个线程上下文切换的最佳时间。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

阿里开源多模态大模型Ovis1.6,重塑出海电商AI格局

阿里开源Ovis1.6:多模态领域再夺第一 阿里再一次证明了自己在多模态领域的实力。这一次,阿里国际AI团队开源的多模态大模型Ovis1.6,不仅成功开源,还在多模态评测基准OpenCompass上击败了Qwen2VL-7B、InternVL2-26B和MiniCPM-V-2.…

ChatGPT 4o 使用指南 (9月更新)

首先基础知识还是要介绍得~ 一、模型知识: GPT-4o:最新的版本模型,支持视觉等多模态,OpenAI 文档中已经更新了 GPT-4o 的介绍:128k 上下文,训练截止 2023 年 10 月(作为对比,GPT-4…

数据结构强化(直播课)

应用题真题分析&备考指南 (三)线性表的应用 (六)栈、队列和数组的应用 (四)树与二叉树的应用 1.哈夫曼(Huffman)树和哈夫曼编码 2.并查集及其应用(重要) (四)图的基本应用 …

伊犁职业技术学院linux 部署教学用首先创建两台linux 主机

1 一台是主机 一台是克隆 能够正常通信,虚拟机全局采用nat 模式 2 主机 地址 192.168.200.10 备机 192.168.200.20 、打开终端 在我们的root 用户上进行配置 另外一台机子也是如此配置流程一样,主要是地址改为 192.168.200.20 不再重复 最终…

【CustomPainter】绘制圆环

说明 绘制一个圆环,进度为0时,显示“圆形”。 效果 源码 MyRingPainter class MyRingPainter extends CustomPainter {final double progress;MyRingPainter({required this.progress});overridevoid paint(Canvas canvas, Size size) {double _stro…

JavaWeb纯小白笔记02:Tomcat的使用:发布项目的三种方式、配置虚拟主机、配置用户名和密码

通过Tomcat进行发布项目的目的是为了提供项目的访问能力:Tomcat作为Web服务器,能够处理HTTP请求和响应,将项目的内容提供给用户进行访问和使用。 一.Tomcat发布项目的三种方式: 第一种:直接在Tomcat文件夹里的webapp…

排序---冒泡排序、堆排序

一、冒泡排序 相邻两个位置交换,假设排升序,就不断把最大的往后拿,所以这段序列从后往前变得有序。 //flag为0,即这个数组已经是有序的了,节省循环次数 二、堆排序(数组实现) 具体原理介绍看这…

道路坑洞分割数据集/道路裂纹分割数据集

1.道路坑洞,道路裂纹分割数据集,包含5790张坑洞分割图像数据(默认分割标注png图片,850MB)2.10000余张道路裂纹图像数据(默认分割标注png图片,3.7GB)3。道路坑洞,道路 道路坑洞与裂纹…

华为昇腾服务器+Atlas300IPro*2 部署Dify+MindIE+Embedding+Rerank实现Qwen2.5-7B全国产化的大模型推理平台

文章目录 一、概要二、平台介绍和相关链接三、MindIE、Embedding、Rerank接口测试四、Dify安装和部署五、测试 一、概要 记录基于华为昇腾推理服务器Atlas300IPro两卡基于MindIE大模型推理引擎和Embedding、Rerank部署dify大模型应用平台。(LangChain-ChatChat和Ne…

安克创新25届校招CATA北森测评:笔试攻略、真题题库、高分技巧

安克创新自适应能力CATA测评是该公司用于评估候选人认知能力的计算机自适应测评系统。该测评系统由北森题库提供支持,是国内唯一被国际计算机自适应测验协会(IACAT)收录的产品。测评主要评估以下几个维度: 言语能力:测试理解言语信息并基于这…

QFramework v1.0 使用指南 更新篇:20240918. 新增 BindableList

20240918. 新增 BindableList BindableProperty 很好用,但是不支持 List 等集合。 而 Bindable List 功能群友呼吁了很久了。 应群友要求,笔者实现了 Bindable List。 基本使用方式如下: using System; using UnityEngine; using UnityEngine.UI;na…

科技打造智享出行:深蓝L07抢先试驾

在深秋九月的金风送爽中,在深蓝L07即将正式发布之际,趣味科技来到山城重庆参加了深蓝L07的全国媒体试驾活动,亲身体验了这款科技智享中型轿车。 而深蓝L07在本次试驾中的表现,也让趣味科技深刻感受到了“智享科技美学、智享科技座…

秒懂Linux之共享内存

目录 共享内存概念 模拟实现共享内存 创建key阶段 ​编辑创建共享内存阶段 删除共享内存阶段 查看共享内存属性阶段 挂接共享内存到进程阶段 取消共享内存与进程挂接阶段 进程通信阶段 添加管道改进版 共享内存函数 shmget函数 shmat函数 shmdt函数 shmctl函数 共享内存概念 共…

Redis中Hash(哈希)类型的基本操作

文章目录 一、 哈希简介二、常用命令hsethgethexistshdelhkeyshvalshgetallhmgethlenhsetnxhincrbyhincrbyfloathstrlen 三、命令小结四、哈希内部编码方式五、典型应用场景六、 字符串,序列化,哈希对比 一、 哈希简介 几乎所有的主流编程语言都提供了哈…

一文带你掌握 tmux -- 高效的终端复用工具

一、什么是tmux? tmux 是一款开源的终端复用器,允许用户在一个终端窗口中访问多个终端会话,同时提供了会话管理功能,使得用户可以在同一个窗口中创建、访问和控制多个会话。它对于需要同时运行多个命令行程序的用户来说非常有用&…

自动化立体仓库几种典型的解决方案

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 完整版文件和更多学习资料,请球友到 知识星球【智能仓储物流技术研习社】 自行下载。 文件《自动化立体仓库几种典型的解决方案》的核…

浅谈“流量回放”

一、流量回放定义 “流量回放”通常指的是将之前记录的网络请求和响应数据重新发送到系统中,以模拟真实用户的操作。这种技术主要用于测试和调试目的,帮助开发人员和测试人员更好地理解系统在特定条件下的行为。 二、流量回放的技术原理: 数…

3、无线通信系统的组成

通常把实现信息传输的系统称为通信系统,下图表示一个通信系统的基本组成。在通信系统中,一般要进行两种变换与反变换。在发送端,第一个变换是输入变换器,它把要传输的信号变为电信号,该信号一般是低频的,而…

YOLOv5白皮书-第Y1周:调用官方权重进行检测

>- **🍨 本文为[🔗365天深度学习训练营](小团体~第八波) 中的学习记录博客** >- **🍖 原作者:[K同学啊](K同学啊-CSDN博客)** 一、前言 拖了好久,终于要开始目标检测系列了。自己想过好几次&#xf…

python中ocr图片文字识别样例(一)

一、使用easyocr安装依赖 pip install easyocr pip install opencv-python-headless # 处理图像二、具体实现,此处有个缺陷,大家可以尝试解决下,识别的文字打印结果没问题,但是图片识别出现乱码: 2.1 具体识别的图片…