java开发中锁的一些概念简述

本地如何安装midscene.js运行环境 手把手教你本地安装midscene.js运行环境 阅读详情

排他锁(独占锁)

锁独占,使用排他锁 则只能由获取锁的一个线程 执行该语句块,其他线程只能等待锁释放后竞争锁

共享锁

共享锁,能由多个线程同时获取锁,并发执行;(可能会问 多个线程并发执行了还加锁干嘛,例如读锁 和写锁,读锁是共享锁,可以多个线程同时获取锁,读锁是为了排斥写锁,当有线程获取读锁的时候 其他线程不能获取写锁)

读写锁

读锁: 也就是共享锁, 多个线程可以同时获取读锁,当有线程在读数据的时候,其他线程不能写
写锁: 排他锁,线程获取写锁后,其他线程不能读
读读可以多线程并发, 读写 , 写读, 写写 都是 互斥的

自旋锁

自旋锁:是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环;
减少了 线程上下文切换的性能消耗,但是如果某个线程持有锁的时间过长,就会导致其它等待获取锁的线程进入循环等待,消耗CPU。使用不当会造成CPU使用率极高;
如果获取锁自选的时间过长就会一直造成cpu空转,消耗资源,所以,我们需要给自旋加一个限定次数,不能让它这样一直的这样转下去。如果超过了这个次数还没获得就要被挂起,但是很有可能会出现一种问题,就是我们刚刚被挂起的时候占用锁的线程刚好释放了锁(这就是特别的缘分),那这样就非常尴尬了。所以在JDK6的时候有了自适应自旋锁

自适应自旋锁

** 把以前定死的自选次数给变成动态的,让自旋的次数不再是固定的了,而是根据上一次在同一个锁的自旋时间和锁的拥有者来判断。
线程如果自旋成功了,那么下一次自旋的次数会更多,因为我们会认为,既然上次已经等待成功了,那么这次的自旋也很有可能成功,于是会增加自选的次数
线程如果自旋失败了,那么下次这个锁就会对这个锁的自旋次数会减少,如果很多线程获取这个锁都自旋失败了很可能导致线程在下一次可能根本就不会去自旋,直接跳过。以免浪费CPU的资源**

偏向锁

偏向锁 是为了 在线程竞争非常少 或者只有一个线程在获取锁释放锁的时候 造成的加锁释放锁的性能消耗的一种解决办法;为了减少锁的获取和释放的资源浪费。
偏向锁只有初始化时需要一次CAS,如果当前线程获取锁偏向锁后则以后可以零成本直接获取锁,而不用参与锁竞争;如果有其他线程竞争,则会升级为轻量级锁

轻量级锁

采用CAS算法进行数据操作,不会加锁,如果出现线程竞争问题 才加锁升级为重量级锁;
举例:b线程在锁竞争时,发现锁已经被a线程占用,则b线程不进入内核态,让b线程自旋,执行空循环,等待a线程释放锁。如果,完成自旋策略还是发现a线程没有释放锁,或者让c线程占用了。则b线程试图将轻量级锁升级为重量级锁。
优点: 竞争的线程不会阻塞,提高了程序的响应速度
缺点: 如果线程一直竞争不到锁,就会一直存于自旋空执行状态,消耗cpu

重量级锁

内置锁在Java中被抽象为监视器锁(monitor)。在JDK 1.6之前,监视器锁可以认为直接对应底层操作系统中的互斥量(mutex)。这种同步方式的成本非常高,包括系统调用引起的内核态与用户态切换、线程阻塞造成的线程切换等。因此,后来称这种锁为“重量级锁。
举例:synchronized使用的就是内置锁,重量级锁

死锁

死锁是多线程竞争条件下,线程之间互相等待释放锁而造成的线程假死状态,线程一直处于等待状态;
产生死锁的必要条件

  1. 互斥条件;即存在多线程对共享资源的竞争且 在一段时间内某资源仅为一进程所占用
  2. 请求和保持条件: 当线程阻塞时,对获取的资源保持不放
  3. 不剥夺条件: 加锁后资源未使用完毕不释放,不可剥夺,只能时使用完毕后自己释放资源
  4. 环路等待条件: 当发生死锁时,所等待的进程必定会形成一个环路(类似于死循环),造成永久阻塞。
    解决死锁的基本方法
    1. 就是破坏其中的一个或者多个产生死锁的条件
    2. 顺序获取锁
    3. 超时放弃 例如使用 tryLock(long time, TimeUnit unit)
公平锁和非公平锁

公平和非公平锁的队列都基于锁内部维护的一个双向链表,表结点Node的值就是每一个请求当前锁的线程。公平锁则在于每次都是依次从队首取值。非公平锁,线程在等待锁的过程中, 如果有任意新的线程妄图获取锁,都是有很大的几率直接获取到锁的获取锁是随机的 而不是按照队列中的顺序的。

其他
  • 活锁: 线程之间 互相让步,导致的 谁都执行不下去

  • 线程饿死:线程长时间获取不到CPU的执行时间片,而导致的一直不能执行的现象

  • 线程饥饿: 由于线程优先级 或其 出现线程独占资源不释放,其他线程只能一直处于等待阻塞状态

  • 锁消除: 是jvm在编译时对锁进行的一种优化,比如有时候我们写的代码其实不用加锁,却执行了加锁操作 比如时对局部变量的同步加锁操作;
    也就是说对非共享对象上进行同步是无效的,因此runtime可以啥也不做。同步有可能是不需要的,这为优化提供了机会。
    因此,如果逃逸分析发现对象是非逃逸的,编译器就可以自行消除同步。

  • 锁粗化: 通常情况下并发编程中,我们会把锁的力度尽量缩小范围,但是在某些情况下 高频率的加锁和释放锁 会严重影响 性能问题,所以出现了 把多个锁合并成一个 把原来每个小范围的加锁操作 合并成能覆盖到原来各个锁的范围的一个锁,扩大了锁范围 不用频繁的加锁释放锁操作而带来的 性能损耗。
    锁粗化就是告诉我们任何事情都有个度,有些情况下我们反而希望把很多次锁的请求合并成一个请求,以降低短时间内大量锁请求、同步、释放带来的性能损耗

  • 锁升级: 例如轻量级锁升级为 重量级锁;或者读锁升级为写锁 ,

  • 锁降级: 写锁降级为读锁,这只是开发中可能会用到的。并不是jvm的锁优化涉及的

总目录- AutoSAR从入门到精通实战系列课程【持续更新中...】 欢迎大家订阅《AutoSAR入门和实战系列》,开始前博主先列出AutoSAR学习的大纲,同时这也可以作为大家学习AutoSAR的参考。想学习和及以及的同学们,可以订阅本博客,本博客一直持续更新中。如果想深入或从本质上学习和理解AutoSAR,打开此链接后,,点击左下方【立即订阅】订阅专栏!!!】...... 阅读详情

相关推荐

PLC1200使用CB1241RS485通讯模块做从站进行Modbus Rtu通信

添加新设备(PLC)->设备和网络管理->点击PLC->看到硬件目录选择通信板->点到点->CB1241(RS485)->看到6ES7241-1CH30-1XB0选择添加,如图。指向Modbus保持寄存器数据块的指针 我这里指向了自定义的DB块数据中一个INT数组。在通信->通信处理模块->MODBUS(选择不带RTU的通信指令块)注意:接线时,TRA接485调试模块的B- TRB接调试模块的A+组态后的硬件标识符 270 对应自己组态后自动生成的。1:事务完成,且无任何错误。波特率对应自己使用的。

swmyaopeng的博客 2万+

JAVA锁

一. JAVA中锁的概念 1、自旋锁: 2、乐观锁: 3、悲观锁: 4、独享锁: 5:共享锁:(限流)

qq_40094875的博客 1582

Vivado图形化界面烧写MCS文件到SPI FLASH全流程(附常见报错解决方案)

本文详细介绍了使用Vivado图形化界面将MCS文件烧录至SPI FLASH的完整操作流程。内容涵盖从环境准备、MCS文件生成到硬件连接与烧写的每一步,并针对SPI总线宽度报错、FLASH型号识别失败等常见问题提供了深度解决方案,帮助用户高效完成FPGA配置,摆脱对TCL命令行的依赖。

s8t9u0v1w的博客 534

java锁详解

java当中的锁、是在多线程环境下为保证共享资源健康、线程安全的一种手段。 线程操作某个共享资源之前,先对资源加一层锁,保证操作期间没有其他线程访问资源,当操作完成后,再释放锁。

SRY12240419的博客 1万+

香橙派R1 Plus LTS变身无线AP/客户端:手把手教你用RTL8811CU和MT7601U网卡刷OpenWRT

本文详细介绍了如何将香橙派R1 Plus LTS开发板通过RTL8811CU和MT7601U两款USB无线网卡刷入OpenWRT系统,实现无线AP热点发射与客户端接入的双重功能。从硬件选型、驱动安装到双网卡协同配置,提供完整的实战指南,帮助用户快速搭建稳定高效的无线网络解决方案。

weixin_30919429的博客 408

讲透 ABAP CDS 注解名称:简单名、结构化名、@ 与 @<、作用域与分组

本文从开发者角度梳理ABAP CDS注解的命名规则与实战写法,重点解析: 语法规则:@与@<的使用场景、结构化命名规范、作用域唯一性要求 评估机制:ABAP运行时与组件框架的注解处理差异 分组技巧:花括号分组简化重复前缀的书写 实战示例:包含完整CDS View Entity(演示注解分组与@<用法)和ABAP报表(读取打印注解) 常见问题:命名错误导致激活失败、框架忽略等注意事项 最后通过航空预订统计案例,展示如何结合多种注解类型实现业务需求。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 261

java什么是锁_java中的锁是什么

锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。Java中的锁主要有以下几种概念:1、同步锁同一时刻,一个同步锁只能被一个线程访问。以对象为依据,通过synchronized关键字来进行同步,实现对竞争资源的互斥访问。2、独占锁(可重入的互斥锁)互斥,即在同一时间点,只能被一个线程持有;可重入,即可以被单个线程多次获取。什么意思呢?根据锁的获取机制,它分为...

weixin_36339470的博客 1706

Node-RED系列(二九):使用slider与chart节点来实现双折线时间序列图

今天教使用dashboard的chart组件和slider组件来是实现一个双线的折线图。效果如下 拖动顶部的电量和水量,低下的图表会实时显示时间和值之所以做这个模拟案例,是将教 大家使用chart节点和slider节点先说一下slider节点,该节点是一个滑块节点,可以接受上一节点的 msg.payload,作为滑块的值, slider必须设置最大值和最小值。且不能动态设置。 此外当用户拖动slider滑块,改变值时,该节点会向下传递当前值 以属性payload装载。在说一下chart节点,该节点可以用于

知无涯 4967

Java 锁机制详解

Java中的锁机制是使用最广泛、最基础的多线程同步技术之一,也是保证线程安全的重要手段。

兴趣是最好的老师,勤能补拙 5233

少儿学编程系列--使用递归画出龙形曲线DragonCurve

龙形曲线(Dragon Curve) 龙形曲线(Dragon Curve)又叫分形龙,是一种自相似碎形曲线的统称,因形似龙的蜿蜒盘曲而得名 使用黄金比例画龙形曲线 根据黄金比例画一条龙曲线。每次递归,第一步向左转32.89度,移动0.74倍原距离;第二个递归步骤向右转46.99度,移动原来距离的0.55倍。请查看这个网页(https://larryriddle.agnesscott.org/ifs/heighway/goldenDragon.htm)了解关于龙形黄线数学的细节 龙形曲线效果 .

penriver的博客 2296

yolov8涨点系列之轻量化主干网络替换

yolov8涨点系列之轻量化主干网络替换,以EfficientVit为例

zhang1379的博客 2887

Java中的锁是什么意思,有哪些分类?

Java锁是一种多线程同步的机制,用于控制多个线程对共享资源的并发访问。Java锁的作用是保证线程间的互斥性(Mutual Exclusion),即同一时刻只有一个线程可以访问共享资源,从而避免多线程间的竞态条件(Race Condition)和其他并发问题。Java锁可以分为两大类:隐式锁(Implicit Locks)和显式锁(Explicit Locks)。隐式锁,也称为内置锁(Intrinsic Locks)或synchronized锁,是Java语言级别提供的一种锁机制。

网络技术联盟站 1075

小程序设计中的区块链应用:数字藏品实现

本文旨在为开发者提供在小程序中实现区块链数字藏品功能的完整技术方案。区块链与数字藏品的基础概念智能合约的设计与实现小程序与区块链的交互方式数字藏品的完整实现流程文章将从基础概念入手,逐步深入到技术实现层面,最后通过完整项目案例展示数字藏品在小程序中的实现方式。每个技术点都会配合代码示例和架构图进行说明。区块链:一种分布式数据库技术,通过加密算法保证数据不可篡改数字藏品:基于区块链技术的数字资产,具有唯一性和可验证性NFT。

小程序开发 1350

java 开发中普遍用到的锁(概念)

锁与线程是相互依存的关系,因为有多线程的存在,线程之间的共有资源在同一线程中不能保证资源操作与线程程序一致(想象一下:多个线程操作一个值每个线程累加10次,每个线程都在读值改值,执行结果是多么的不可预测,全乱了),此时锁机制就派上了它的用场。锁=>锁的是访问资源某个或多个权限(如读,写,读写),有且只有一把钥匙也可多把(共享锁),用以线程获取,持有钥匙的线程操作数据,其他不能操作。上锁的资源,多线程下只能串行?所以上锁是一种低效的代码运行,即针对这种低效我们的前辈们采用了各种的方法进行了相关优化。

mwxs111的博客 997

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java里的各种“锁”

自旋锁的核心思想是:当一个线程尝试获取锁时,如果锁已被其他线程占用,它不会立即挂起线程,而是在循环(忙等)中持续尝试获取锁 —— 就像“原地打转”,所以叫“自旋”。特性描述不释放 CPU自旋时线程不会被挂起,占用 CPU 资源适合短时间锁如果持锁时间很短,自旋比挂起/恢复效率高不适合高并发若持锁时间长或竞争激烈,自旋浪费大量 CPU一般配合 CAS常配合等无锁原语实现(总结一句话:自旋锁用 CPU 换时间,适合“快进快出”的临界区操作。

2301_80365603的博客 1212

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java锁相关概念的简单理解

这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。:是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

欢迎来到我的博客 1044

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

零基础学 Java 锁:从概念到代码,吃透 8 种常用锁

锁类型核心特性实现方式适用场景悲观锁阻塞竞争,冲突假设频繁写多、冲突频繁乐观锁无阻塞,冲突假设少,CAS 实现读多、冲突少(计数器、ID 生成)可重入锁同一线程可重复获取锁递归调用、多层锁嵌套公平锁按等待顺序分配,无饥饿对公平性要求高的场景非公平锁允许插队,效率高对效率要求高,可接受轻微不公平读写锁读 - 读共享,读 - 写 / 写 - 写互斥读多写少(缓存、统计)偏向锁单线程无竞争,开销最小synchronized 优化单线程重复加锁轻量级锁。

2201_75355172的博客 1559

Java中锁的升级与死锁详解

锁类型锁的状态适用场景特点偏向锁初始锁状态没有其他线程竞争时几乎没有开销轻量级锁偏向锁竞争失败时存在轻微的锁竞争时使用 CAS 尝试获取锁重量级锁轻量级锁竞争失败时存在大量线程竞争时会导致线程阻塞与上下文切换死锁是指两个或多个线程因争夺资源而互相等待,导致程序无法继续执行。互斥条件:至少有一个资源必须处于非共享模式,即只能由一个线程使用。请求与保持条件:线程在请求资源时,已经持有其他资源。不剥夺条件:已经分配给线程的资源,在没有使用完之前,不能强行剥夺。循环等待条件。

一碗黄焖鸡三碗米饭的博客 1331

锁的基本概念

锁的基本概论

jmlkid的博客 1709

锁的等级:方法锁、对象锁、类锁。

(1)基础Java中的每一个对象都可以作为锁。对于同步方法,锁是当前实例对象。对于静态同步方法,锁是当前对象的Class对象。对于同步方法块,锁是Synchonized括号里配置的对象。    当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。那么锁存在哪里呢?锁里面会存储什么信息呢?(2)同步的原理JVM规范规定JVM基于进入和退出 Monitor 对象来实现方法同步...

change的博客 1768

图解Java中那18 把锁

乐观锁和悲观锁独占锁和共享锁互斥锁和读写锁公平锁和非公平锁可重入锁自旋锁分段锁锁升级(无锁|偏向锁|轻量级锁|重量级锁)锁优化技术(锁粗化、锁消除)乐观锁和悲观锁悲观锁悲观锁对应于生活中悲...

Java知音 1605

java中锁有哪几种?

在 Java 中,锁是一种用于控制并发访问的机制,它可以确保在多线程环境下,对共享资源的访问是串行化的,从而避免竞态条件和数据不一致性。

水巷石子的博客 910

java高并发之锁

并发锁是一种同步机制,用于控制多个线程或进程对共享资源的访问,以防止数据竞争和保证数据一致性。在多线程或多进程环境中,当多个执行单元同时尝试修改同一资源时,如果没有适当的控制,可能会导致不一致或不可预测的结果。锁提供了一种机制来确保在任何时刻只有一个执行单元可以访问特定的资源。互斥锁(Mutex)互斥锁是最基本的锁类型,用于保护临界区,确保同一时间只有一个线程可以访问共享资源。当一个线程获得互斥锁时,其他线程必须等待,直到锁被释放。读写锁(Read-Write Lock)

qq_36070104的博客 1357

全面了解Java中的15种锁概念及机制。

CAS是英文单词(比较并交换),是一种有名的无锁算法。无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步()。CAS算法涉及到三个操作数1.需要读写的内存值 V2.进行比较的值 A3.拟写入的新值 B更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B,否则不会执行任何操作。一般情况下是一个自旋操作,即不断的重试。...

JHIII的博客 306

Java并发编程:公平锁与非公平锁详解及源码分析

Java并发编程:公平锁与非公平锁详解及源码分析

qq_30667039的博客 873

Java 锁的理解

文章目录公平锁与非公平锁非公平锁公平锁关于公平锁与非公平锁的区别可重入锁(也叫作递归锁)举例自旋锁自旋锁的好处举例独占锁(写锁)/共享锁(读锁)/互斥锁举例(未使用读写锁)举例(使用读写锁) 公平锁与非公平锁     用过并发包的朋友对这个应该不会陌生,ReentrantLock 是 Java 的 JUC(java.util.concurrent)包中提供的一种可重入锁,是一种递归无阻塞的同步机制。ReentrantLock 等同于synchronized关键字,但是 ReentrantLock 提供了比

Woo_home的博客 2415
上一篇: 多线程学习之 Exchange
下一篇: java并发之CAS和AQS
xiaoduup
博客等级 码龄9年 23粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值