Java锁

VS2022+Qt6保姆级环境配置指南:从插件安装到项目互通全流程 本文提供VS2022与Qt6深度整合的全流程指南,涵盖环境配置、插件安装、项目互通等关键步骤。详细解析编译器版本匹配、跨IDE协作方案及效能优化技巧,帮助开发者高效搭建C++界面设计开发环境,实现软件项目无缝互通。 阅读详情

锁类型

锁按照不同的标准可以定义出不同类型。

  • 可重入锁/不可重入锁
  • 公平锁/非公平锁
  • 独占锁/共享锁
  • 乐观锁/悲观锁
  • 偏向锁/轻量级锁/重量级锁

可重入锁/不可重入锁

按照锁是否可以嵌套获取,我们可以将锁分为可重入锁和不可重入锁。Java中的synchronized和ReentrantLock都是可重入锁,现在基本上很少见不可重入锁,不可重入锁在嵌套获取锁的时候会阻塞出现死锁。如下代码就是一个不可重入锁,永远不会打印lock second。

public static void main(String[] args) {
	NonReentrantLock lock = new NonReentrantLock();
	lock.lock();
	System.out.println("lock first");
	lock.lock();
	System.out.println("lock second");
}

公平锁/非公平锁

按照锁的公平性可以分为公平锁和非公平锁。

公平锁:线程获取锁的顺序和线程得到锁的顺序是严格一致的,也就是A和B线程,如果A先来,那么A就必然先获取到锁。

非公平锁:和公平锁不同,如果A和B线程都来获取同一锁并阻塞等待,A和B都可能先获取到锁。

Java中ReentrantLock的空构造函数和synchronized都是非公平锁,因为要保证公平性必然会浪费一定的资源。(试想一下,对于公平锁,在锁释放时,如果线程A还没有获取到CPU资源,锁就得等待线程A获取到CPU资源然后将锁给A使用;而如果是非公平锁他发现A线程没有获取到CPU资源,他可以把锁交给已经获取到CPU资源的B线程,对锁的利用率更高)。

如果需要使用非公平锁,可以使用ReentrantLock的一个boolean型构造函数,传入true,进行创建。

public ReentrantLock(boolean fair) {
	sync = fair ? new FairSync() : new NonfairSync();
}

独占锁/共享锁

按照锁是否可以被多个线程获取,可以分为独占锁和共享锁。Java中,ReentrantReadWriteLock读写锁中有两个锁,读锁和写锁,其中读锁就是共享锁,可以被多个线程获取;而写锁就是独占锁,在写锁被占用的时候,读锁也不能获取。

public ReentrantReadWriteLock.WriteLock writeLock() { return writerLock; }
public ReentrantReadWriteLock.ReadLock  readLock()  { return readerLock; }

写锁和其他锁(读锁和写锁)属于互斥关系,读锁和读锁可以共享,但是读锁和写锁也属于互斥关系,下面写了个例子,有兴趣的人可以跑一下。

SimpleDateFormat format = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
System.out.println(format.format(new Date()) + " " + Thread.currentThread().getName() + " try get readLock");
lock.readLock().lock();
System.out.println(format.format(new Date()) + " " + Thread.currentThread().getName() + " get readLock");
new Thread(new Runnable() {
	@Override
	public void run() {
		try {
			System.out.println(format.format(new Date()) + " " + Thread.currentThread().getName() + " try get readLock");
			lock.readLock().lock();
			System.out.println(format.format(new Date()) + " " + Thread.currentThread().getName() + " get readLock");
			Thread.sleep(2000);
			lock.readLock().unlock();
			System.out.println(format.format(new Date()) + " " + Thread.currentThread().getName() + " release readLock");
			Thread.sleep(1000);
			System.out.println(format.format(new Date()) + " " + Thread.currentThread().getName() + " try get readLock");
			lock.readLock().lock();
			System.out.println(format.format(new Date()) + " " + Thread.currentThread().getName() + " get readLock");
			lock.readLock().unlock();
			System.out.println(format.format(new Date()) + " " + Thread.currentThread().getName() + " release readLock");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}).start();
Thread.sleep(1000);
lock.readLock().unlock();
System.out.println(format.format(new Date()) + " " + Thread.currentThread().getName() + " release readLock");

System.out.println(format.format(new Date()) + " " + Thread.currentThread().getName() + " try get writeLock");
lock.writeLock().lock();
System.out.println(format.format(new Date()) + " " + Thread.currentThread().getName() + " get writeLock");
Thread.sleep(2000);
lock.writeLock().unlock();
System.out.println(format.format(new Date()) + " " + Thread.currentThread().getName() + " release writeLock");
Thread.sleep(10000);

运行结果:

2018-05-10 11:07:11 main try get readLock
2018-05-10 11:07:11 main get readLock
2018-05-10 11:07:11 Thread-1 try get readLock
2018-05-10 11:07:11 Thread-1 get readLock
2018-05-10 11:07:12 main release readLock
2018-05-10 11:07:12 main try get writeLock
2018-05-10 11:07:13 Thread-1 release readLock
2018-05-10 11:07:13 main get writeLock
2018-05-10 11:07:14 Thread-1 try get readLock
2018-05-10 11:07:15 main release writeLock
2018-05-10 11:07:15 Thread-1 get readLock
2018-05-10 11:07:15 Thread-1 release readLock

乐观锁/悲观锁

使用乐观锁和悲观锁,我个人理解其实关注点是对待一个可能出现竞争的问题的态度,如果我们认为这个操作只有少数情况下才会出现并发问题,那么使用一个乐观锁会更优。如果并发比较高,使用悲观锁就是更好。

乐观锁:乐观锁态度认为不加锁通常都不会有竞争,如果有竞争采用失败重试的方式循环操作直到成功,通常乐观锁采用一种原子更新+重试的方式,比如数据库增加版本号,通过update + where 版本号信息进行更新,如果update返回行数为0,则进行重试。

悲观锁:悲观锁态度认为竞争总是存在,所以每次都直接加锁进行操作。

偏向锁/轻量级锁/重量级锁

偏向锁/轻量级锁/重量级锁属于JVM锁优化的东西,和上面的锁不属于一个维度,我们在编程的时候无法察觉。

偏向锁:目的是在消除数据在无竞争的情况下的同步,从而提高系统的性能。在第一个线程获得到一个对象的锁时,在没有其他线程访问来获取锁之前,该锁是偏向锁,该线程不会同步数据到主存,减少了同步(加锁)的开销。在JVM启动参数增加-XX:+UseBiasedLocking会JVM会启动偏向锁,JDK1.6之后默认是开启的。

轻量级锁:目的是在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗。偏向锁是当只有一个线程使用一个锁的时候JVM进行的锁优化,但是当有另一个线程来获取锁的时候,偏向锁就不再有效,会膨胀成轻量级锁。轻量级锁是采用CAS将当前线程的栈帧中的信息和锁对象头中的信息交换来实现加锁,减少了互斥带来的开销。

重量级锁:偏向锁和轻量级锁都属于没有锁竞争的情况下的锁优化,一旦出现两个线程都需要同一个锁(发生了锁竞争),锁就会膨胀成重量级锁。

关于JVM的锁优化知识这里不详细介绍,还有自旋锁/锁消除/锁粗化等。关于锁优化的知识,有兴趣的可以阅读《深入理解Java虚拟机》周志明版的高效并发章节。

元数据治理实战:构建企业数据地图与血缘体系 元数据(Metadata)是描述数据的数据,是你能了解“数据是怎么来的”、“它是做什么的”、“能不能用”的基础信息。📌 举个例子:order_idstringods_order定义:平台内用户在订单系统中产生的唯一订单编号更新时间:每天凌晨 2 点,由 Airflow 调度任务生成所属人:张三(数据开发部)🔍 这些信息本身不直接参与计算,但它们是数据可管理、可追踪、可评估的基础。模块实战建议元数据类型技术 + 业务 + 操作元数据三类统一治理治理路径。 阅读详情

相关推荐

TDISP(TEE Device Interface Security Protocol)软件操作流程

/ 1. SPDM会话相关定义(🔶1-37、🔶1-187)// SPDM会话ID// AES-256-GCM加密密钥(TDISP要求)// 初始向量// 会话是否激活// 2. IDE流配置(🔶1-52、🔶1-625)// IDE流ID// 4个子流的AES密钥(覆盖所有子流类型)// 密钥是否已配置// 3. TDI状态与配置(🔶1-207、🔶1-210)TDI_CONFIG_UNLOCKED = 0, // 初始配置态。

inquisiter 1433

Java 公平锁与非公平锁详解

对比维度公平锁非公平锁排队机制严格遵守FIFO允许插队吞吐量较低较高响应时间可预测不确定实现难度较复杂较简单避免饥饿能不能核心结论公平锁保障绝对的请求顺序非公平锁提供更高的吞吐量Java中锁的默认行为是非公平的(符合大多数场景)在需要严格顺序的业务中才使用公平锁。

yuren_xia的博客 999

Unity Hub报错The Hub as encountered a critical error and must close

如果注册表HKEY_LOCAL_MACHINE\SOFTWARE\Unity Technologies\这个目录下有Hub文件,直接删掉然后重装就可以。C:\Users\Administrator\AppData\Roaming\Unity 作者:SevenVee。HKEY_CURRENT_USER\Software\Unity 下所有项,尝试过,卸载重装,清除临时文件无果后,最终决定删除所有与Hub有关的文件。重装unity后可以打开了。结果:卸载重装后还是会出现此问题。结果:重装后还是无法解决。

qq_42345116的博客 3638

java锁Synchronized锁膨胀

在java中,synchronized锁的膨胀是指锁从轻量级状态逐步升级为更重的状态,以适应并发情况的变化。这种锁升级机制是为了在不同的线程竞争强度下提供合适的锁实现,最大化性能。锁的膨胀过程从“无锁”到“偏向锁”,再到“轻量级锁”,最终可能升级为“重量级锁”。这个机制通过减少不必要的线程阻塞和上下文切换,提高了性能。

weixin_41863236的博客 2016

Abaqus仿真突然中断?手把手教你解决SIGTERM/SIGINT报错(附完整命令行方案)

本文深入解析Abaqus仿真中因SIGTERM或SIGINT信号导致进程意外中断的根本原因,并提供了一套完整的命令行解决方案。通过将作业提交方式从图形界面切换到命令行,并配合关键参数设置,可以有效避免因会话空闲超时或外部干扰引发的计算中断,保障长时间仿真任务的稳定运行。

devops8pract的博客 746

Marvell 88E6390x交换芯片:从零构建No-CPU模式网络交换系统

本文详细介绍了如何为Marvell 88E6390x以太网交换芯片构建No-CPU模式网络交换系统。通过解析其核心价值与硬件准备,并手把手指导使用CodeBlocks、IMPGUI和SwitchGUI等软件工具进行配置代码编写、镜像生成与烧录,最终实现交换芯片脱离外部CPU独立工作,适用于成本敏感、空间受限的嵌入式网络设备设计。

plant的博客 483

Java锁的种类

概述 锁大概有以下名词: 自旋锁、自旋锁的其他种类、阻塞锁、可重入锁、读写锁、互斥锁、悲观锁、乐观锁、公平锁、偏向锁、对象锁、线程锁、锁粗化、锁消除、轻量级锁、重量级锁、信号量、独享锁、共享锁、分段锁。 我们所说锁的分类其实应该按照锁的特性和设计来划分。 其实从并发的角度来讲,按照线程安全的三种策略看,主要内容都集中在互斥同步里,我们所讨论的锁也集中在这个部分,这个部分的锁都是悲观锁;第二个部分是非阻塞同步,这个部分也就一种通过CAS进行原子类操作,这个部分可以看成乐观锁,其实也就是不加锁;第三个部分是无同

抽象的螺旋 6228

069、自动曝光(AE)测光策略:全局/中心/点测光与曝光时间增益分配

本文深入探讨了自动曝光(AE)测光策略的技术细节与实际应用。作者通过多个真实案例(手机前置摄像头、车载ADAS、安防监控等)分析了全局测光、中心测光和点测光的优缺点,指出不同场景应采用不同策略。重点剖析了曝光时间与增益分配的"跷跷板效应",提出要根据传感器特性选择最优分配方案。文章强调测光策略应动态调整,并给出5条实用建议:结合场景切换测光模式、关注传感器增益拐点、点测光需防抖处理、全局测光不宜迷信、调试要观察亮度直方图。最后指出AE调试需要结合具体硬件特性进行实测优化,没有通用解决方案。

zzfmlxs的博客 101

java的锁概括

java的锁概括

qq_40453972的博客 1684

基于 Qt C++ 的 2D 动画制作工具

你可以修改它的中心坐标 (X, Y)、宽度 (W)、高度 (H),或点击 "选择颜色" 按钮改变其填充色。* **图形视图 (`QGraphicsView` 和 `QGraphicsScene`)**: 用于显示和编辑当前帧的内容。

寒寒豆豆软件公司的博客 115

工程测量不用愁,120个视频动画帮你忙,简单易学直观明了!

工程测量不用愁,120个视频动画帮你忙,简单易学直观明了!文末提供下载地址。 下载地址: 链接:https://pan.baidu.com/s/11S6XDq9Eaa3DG3VKRMBIPg

智慧空间实验室 1019

Java锁——什么是锁?

锁的概念基础与一些底层的分析

泯灭于众生,高歌于孤夜! 2490

Unreal5从入门到精通 专栏目录

欢迎来到“UE5从入门到精通”专栏!在这里,我们将带您踏上一段精彩的旅程,深入探索虚幻引擎5(Unreal Engine 5)的无限可能。不论您是游戏开发的新手,还是希望提升技能的开发者,这里都有适合您的内容。基础知识:了解虚幻引擎5的界面、功能和基本操作,为您的学习打下坚实的基础。项目实战:通过实际项目案例,帮助您从理论走向实践,真实体验游戏开发的每个环节。高级技巧:分享各种高级功能和技巧,包括蓝图、C++编程、材质编辑、光照和渲染等,让您能够创作出更具专业水准的作品。

TxNet 2988

Java中到底有哪些锁

读锁是共享锁,写锁是独享锁。在代码进入同步块的时候,如果同步对象锁状态为无锁状态(锁标志位为“01”状态,是否为偏向锁为“0”),虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间,用于存储锁对象目前的Mark Word的拷贝,然后拷贝对象头中的Mark Word复制到锁记录中。如果轻量级锁的更新操作失败了,虚拟机首先会检查对象的Mark Word是否指向当前线程的栈帧,如果是就说明当前线程已经拥有了这个对象的锁,那就可以直接进入同步块继续执行,否则说明多个线程竞争锁。

SevenCoding的博客 1408

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java—锁

1:这篇我们讲到了一些不同特性的锁,如悲观乐观,重量轻量等2:然后我们又讲到了CAS比较并交换的工作原理,以及它的ABA问题3:同时我们又谈到了sychronized的底层原理,以及早期sychronized的问题,并进行的锁升级的优化改进等。4:然后又对锁消除和锁粗化进行了大概的意思阐述。

m0_73233932的博客 1199

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java中有哪些锁?

是 Java 最基础的锁机制,用于实现方法或代码块的同步,保证多线程环境下的原子性、可见性和有序性。竞争激烈时,线程进入阻塞状态,依赖操作系统的互斥量(Mutex)管理。提供更灵活的读写锁控制,支持乐观读、悲观读、写锁三种模式,性能优于。允许多个线程同时读,但写线程独占资源,适用于读多写少的场景。读多写少且对性能要求极高的场景,但需谨慎处理锁转换逻辑。:默认抢占式获取锁,不保证等待时间长的线程优先获取。需要复杂同步控制的场景,如多条件等待、锁超时处理。:写线程获取锁时,禁止其他读/写操作。

qq_45906596的博客 2826

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java并发 - Java中所有的锁

Java 中提供了多种锁机制,用于实现多线程之间的同步和互斥。

--土拨鼠-- 2309

Java中锁的分类

Java中锁的分类1、可重入锁/不可重入锁2、可中断锁3、公平锁/非公平锁4、独享锁(互斥锁)/共享锁(读写锁)5、乐观锁/悲观锁6、分段锁7、偏向锁/轻量级锁/重量级锁8、自旋锁 先来一段很常见的死锁代码: class Deadlock { public static String str1 = "str1"; public static String str2 = "str2"...

@龙猫的博客 3618

java 有多少种锁_java有哪些锁?java锁种类盘点

学习java一定要全方面的了解java的知识,这样才能更好的运用到工作中去,比如java锁的知识点,那么接下来,我们就来给大家讲解一下java锁种类。大家可以参考以下文章。1.公平锁/非公平锁公平锁是指多个线程按照申请锁的顺序来获取锁。非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。2.可重入锁可重入锁又名递...

weixin_35645813的博客 4111

Java锁和锁的升级

本文介绍了Java中锁的基本知识和锁升级,包括无锁状态、偏向锁、轻量级锁和重量级锁。锁的升级过程根据竞争情况和线程的状态逐渐提升锁的级别。在多线程编程中,需要根据实际情况选择合适的锁类型,并注意锁的使用对程序性能的影响。公众号请关注"果酱桑", 一起学习,一起进步!

果酱 の 博客 4043

Java锁详解

在 Java 多线程环境中,锁是确保共享资源线程安全的重要手段。当线程要操作共享资源时,需先获取对应的锁,以此保证在操作过程中,该资源不会被其他线程访问。待操作结束后,线程释放锁,使其他线程有机会获取并操作该资源。AQS 是 Java 并发包()的核心框架,通过一个变量表示锁状态,并利用Unsafe类实现原子操作(如 CAS)来管理线程竞争。状态不可逆:锁状态严格遵循 无锁 → 偏向锁 → 轻量级锁 → 重量级锁 的单向升级路径,避免因频繁状态切换带来的额外开销。性能优化策略。

qq_45675973的博客 1726

Java 公平锁与非公平锁

公平锁与非公平锁: 锁Lock分为公平锁和非公平锁。 公平锁:表示线程获取锁的顺序是按照加锁的顺序来分配的,及先来先得,先进先出的顺序。 非公平锁:表示获取锁的抢占机制,是随机获取锁的,和公平锁不一样的就是先来的不一定能拿到锁, 有可能一直拿不到锁,所以结果不公平。 公平锁实例: public class Service { private ReentrantLock lock; pub...

抛弃幻想,准备斗争 6762

Java中常见的锁

Java中常见的锁 一、悲观锁,乐观锁 1、悲观锁 定义:对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有其他线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被其他线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。 2、乐观锁 定义:在并发操作时,认为不会有其他的线程来修改数据,所以不会加锁。在更新数据的时候会判断有没有其他线程更新这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入,如果数据已经被其他线程更新,则会根据不同的实现方

youngjre的博客 3440

Java中的锁的分类以及锁优化

Java中的锁的分类以及锁优化 只要涉及到并发问题,同步往往并不可少的,而同步的实现比较简单的方式就是加锁。 Java锁的种类 乐观锁/悲观锁 乐观锁:通俗地说就是不管是否有并发问题的风险,先进行操作,如果没有其他线程争用共享数据,那操作就成功了;如果共享的数据的却被争用,产生了冲突,那再进行其他的补偿措施,最常用的补偿措施是不断地重试,直到出现没有竞争地共享数据为止;常见的乐观锁实现机制有两种: CAS操作 CAS(Compare and Swap 比较并交换),当多个线程尝试使用CAS同时更新同一

小小小小小乐的博客 1557

java锁

如果一系列的连续操作都对同一个对象反复加锁和解锁,甚至加锁操作都是出现在循环体体之中,就算真的没有线程竞争,频繁地进行互斥同步操作将会导致不必要的性能损耗,所以就采取了一种方案:把加锁的范围扩展(粗化)到整个操作序列的外部,这样加锁解锁的频率就会大大降低,从而减少了性能损耗。如线程A持有资源x,线程B持有资源y,线程A等待线程B释放资源y,线程B等待线程A释放资源x,两个线程都不释放自己持有的资源,则两个线程都获取不到对方的资源,就会造成死锁。只能有一个线程获取锁,以独占的方式持有锁。

a1148233614的博客 891

Java 锁优化详解

锁优化是提升并发程序性能的重要手段,Java 提供了多种锁优化机制,如锁粗化、锁消除、偏向锁、自旋锁等。通过合理使用这些优化技术,开发者可以减少锁的开销,提高程序的并发性能。在实际开发中,选择合适的锁策略和优化方法至关重要。对于读多写少的场景,可以使用读写锁;对于频繁访问的共享资源,可以使用无锁的并发类。理解锁优化的原理和最佳实践,可以帮助开发者编写高效的并发程序。

m0_38053034的博客 1192
上一篇: Git学习笔记
下一篇: Java线程池
丶洗牙刷脸
博客等级 码龄10年 3粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值