显式锁

基础篇:内置锁和显式锁摸底 内置锁和显式锁是 Java 的两种不同加锁机制,在实际开发中是互斥的,只能选择一种方式,不能混用。笔者近几年在 优快云 问答模块看到不少关于 synchronized 和 wait、notify 的提问,意识到这可能是初学者不太容易理明白的问题,所以本文来整理下二者的用法和注意事项。 内置锁和显式锁 内置锁和显式锁完成简单的同步代码逻辑,这里的简单是不使用条件队列的情况下,其实没什么特别注意的... 阅读详情

在java5之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile。5新增了一种机制,ReentrantLock。与之前的机制不同的是,ReentrantLock不是一种替代内置锁的机制,而是当内置锁机制不适用时,作为一种可选择的高级功能。

Lock

Lock是显式锁的抽象接口,提供了加锁、解锁等功能。它提供了一种无条件的、可轮询的、定时的以及可中断的锁获取操作。

ReentrantLock

它是Lock的实现,提供了与synchronized相同的互斥性和内存可见性。它也提供了可重入的加锁语义。但它比synchronized更加灵活。

使用显式锁的时候一定要记住,在finally块中释放锁。

轮询锁和定时锁

可定时和可轮询的锁模式是通过tryLock方法来实现。于无条件的锁获取机制,它具有更完善的错误恢复机制。

在内置锁中,死锁是一个严重的问题,恢复程序的唯一方法就是重新启动程序,而防止死锁的唯一方法就是在构造程序时避免出现不一致的锁顺序。可定时与可轮询的锁提供了另一种选择:避免死锁的发生。

可中断的锁获取操作

Lock中提供的lockInterruptibly方法能够在获得锁的同时保持对中断的响应。

可中断的锁获取操作的标准结构比普通的锁获取操作略微复杂一些,因为需要两个try块,但是如果在可中断的锁获取操作中抛出了InterruptedException,那么可以使用标准的try-finally加锁模式。

定时的tryLock同样也支持中断操作。

公平性

ReentrantLock的构造器提供了两种公平性选择:创建非公平的锁(默认)或者一个公平锁。

在公平锁上,线程将按照它们发出请求的顺序来获得锁,但在非公平的锁上,则允许“插队”:当一个线程请求非公平锁时,如果在发出请求的同时该锁的状态变为可用,那么这个线程将跳过队列中所有的等待线程并获得这个锁。

其实非公平的ReentrantLock并不提倡“插队”。在公平锁中,如果有另一个线程持有这个锁或者有其他线程在队列中等待这个锁,那么新发出的请求的线程将被放入队列中。非公平的锁中,只有当锁被某个线程持有时,新发出的请求的线程才会被放入队列中。

多数情况下,非公平锁的性能要高于公平锁。原因就在于,在激烈竞争的情况下,在恢复一个被挂起的线程与该线程真正开始运行之间存在着严重的延迟。

当持有锁的时间相对较长,或者请求锁的平均时间间隔较长,那么应该使用公平锁。

在synchronized和ReentrantLock之间进行选择

仅当内置锁不能满足需求时,才可以考虑使用ReentrantLock。一般在使用:可定时、可轮询的与可中断的锁获取操作,公平队列,以及非块结构的锁时才可以考虑使用ReentrantLock,其他情况还是使用synchronized。

而且synchronized是JVM的内置属性,它能执行一些优化。ReentrantLock是通过基于类库的锁来实现这些功能,以后性能提升的可能性不大。

读-写锁

ReentrantLock是一种标准的独占锁,每次最多只能有一个线程持有ReentrantLock。它可以很好的保护“写-写”、“写-读”和“读-读”的情况,但实际情况中,多数操作都是读操作,独占的控制显然影响了效率。

所以提出了读-写锁,一个资源可以同时被多个读操作访问或者被一个写操作访问,但是读或写不能同时进行。

ReadWriteLock同时提供了两个Lock,一个用于读操作,一个用于写操作。

ReentrantReadWriteLock实现了ReadWriteLock,同样可以选择是非公平锁(默认)还是公平锁。

对于公平锁,等待时间最长的线程将优先获得锁。如果这个锁由读线程持有,而另一个线程请求写入锁,那么其他读线程都不能获得读取锁,直到写线程使用完并释放了写入锁。

非公平锁,线程获得访问许可的顺序是不确定的。

当锁的持有时间较长并且大部分操作都不会修改被守护的资源时,读-写锁能提高并发性。

一文理解近红外光谱数据建模步骤的细节(细节知识总结) 上一篇文章,向入门的同志大体介绍了近红外光谱数据建模的内容,依据上文其实已经可以基本完成数据建模的工作,但是很多工作不够细致,本文便是分享其中的一些技术细节。 阅读详情

相关推荐

LangChain学习及应用(超详细)

Model I/O 部分是与语言模型进行交互的核心组件,包括输入提示(Prompt Template)、调用模型(Model)、输出解析(Output Parser)。简单来说,就是输入、处理、输出这三个步骤。LLM 因其具有海量参数,需要花费相当的物力与时间成本进行预训练和微调,同时商用 LLM 还需要进行各种安全测试与风险评估等。因此 LLM 会存在知识滞后的问题。在专有领域,LLM 无法学习到所有的专业知识细节,因此在面向专业领域知识的提问时,无法给出可靠准确的回答。

weixin_39764056的博客 4245

多线程(四)显式锁、队列同步器

Lock、AQS、独占锁、共享锁

HK的博客 798

机器学习笔记之玻尔兹曼机(一)基本介绍

在受限玻尔兹曼机——模型表示(Representation)一节中以玻尔兹曼机为引,介绍了受限玻尔兹曼机。从本节开始,将正式介绍玻尔兹曼机。相比于它的表示和推断过程,我们更关注它在求解过程中出现的问题。

静静的学习就好 7924

Java中锁的学习(一)

Java锁的学习

iwanttostudyok的博客 2688

Crossbar RRAM技术解析:从1TnR架构到存储革命

非易失性存储器(NVM)是数据存储的核心技术,其原理基于物理状态的稳定改变以实现数据持久化。阻变存储器(RRAM)作为一种新兴NVM,利用导电细丝在介质层中的形成与断裂实现数据存储,具有高速、低功耗和结构简单的优势。在工程实践中,RRAM面临潜行路径电流等挑战,而Crossbar提出的1TnR架构通过引入共享晶体管有效解决了这一问题,在保证性能的同时提升了集成密度。该技术与CMOS工艺兼容,支持后端集成与多层堆叠,为高密度存储和嵌入式应用提供了新的解决方案。结合当前行业对高能效、高密度存储的需求,RRAM在

weixin_42523104的博客 319

Debian 11 下用hostapd+dnsmasq搭建WiFi热点:从命令行到实战(避坑指南)

本文详细介绍了在Debian 11系统上,使用hostapd和dnsmasq从命令行搭建稳定WiFi热点的完整实战流程。内容涵盖环境准备、无线网卡AP模式检查、服务深度配置,并重点提供了从服务启动失败到客户端无法上网等常见问题的系统性排错指南,帮助用户避开配置陷阱,成功创建可用的无线接入点。

CAT789的专栏 772

隐式锁与显式锁

文章目录一、隐式锁1、同步代码块2、同步方法二、显示锁Lock三、区别1、实现方式2、是否公平3、灵活性4、内存泄漏5、使用方式6、是否可中断7、精确唤醒四、共同点 一、隐式锁 隐式锁中又分为同步代码块和同步方法,但是都是基于Synchronized关键字来实现的,因为他只需要是使用管关键字就可以,不用显示加锁和解锁的过程,所以称之为隐式锁。 1、同步代码块 在代码块前面加上Synchroized关键字,并在后面的小括号内传入锁对象,这里的this是指定了当前的这个对象作为锁,注意任何对象都是可以作为锁来使

西北的博客 1167

【图论】系列(七)图论的中心性度量方法及重要性评价指标

图论中的中心性度量方法是用来衡量图中各个节点(或顶点)相对重要性的指标。

qq_30066733的博客 1075

Java面试题:解释Java中的锁机制,如内置锁和显式锁,并讨论它们的性能影响

内置锁是Java语言级别提供的锁机制,通过关键字实现。每个Java对象都有一个内置锁,用于同步代码块或方法。显式锁是Java并发包()提供的锁机制,通过Lock接口和其实现类(如)实现。Java中的内置锁和显式锁各有优缺点。内置锁使用简单,适合大多数基本同步需求,但在高竞争下性能可能较差。显式锁提供更多控制和功能,在复杂同步场景中表现更好,但使用起来更复杂,并且可能带来更多的编程错误和性能开销。在实际开发中,选择合适的锁机制是提高并发性能的关键。

杰哥在此的专栏 550

在RV1126上实现人脸识别----MobileFaceNet转成rknn模型

目录 1.模型下载 2 转成rknn模型并推理 3 查看网络模型 1.模型下载 首先下载MobileFaceNet的模型,github下载地址为:https://github.com/sirius-ai/MobileFaceNet_TF/tree/master/arch/pretrained_model/ 2 转成rknn模型并推理 import numpy as np import cv2 from rknn.api import RKNN if __name__ == '__..

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 3526

继电保护原理1.2-反时限过流保护

反时限过流保护

让你爱上电路设计 1万+

线程的显式锁(Lock)·读写锁(ReadWriteLock)·条件阻塞(Condition)

显式锁·读写锁·条件阻塞0 锁的条件1. 显式锁(Lock)1.1 用法场景1.2 Lock与synchronized1.3 显式锁(Lock)的具体实现2. 读写锁(ReadWriteLock)2.1用法场景2.2原理2.3实现代码3. 条件阻塞(Condition)3.1 Condition的优点3.2具体实现 在一些多个线程同时访问一些共享数据,一般都会涉及到线程安全问题。这时候就需要使用...

站在墙头上的博客 942

【信息系统项目管理师】高分论文:论信息系统项目的整合管理(绩效考核系统)

我们将项目管理计划中的子计划包括项目范围、进度、成本、质量管理计划,过程改进计划,人力资源管理计划,风险、采购管理计划,干系人管理计划,项目范围、成本、进度基准作为依据,查看项目的各个方面,通过组织全体团体成员会议来解读由各监控过程提供的信息,之后我与项目管理团队一起制订所需措施,确保项目绩效达到预期要求。在一个项目中,变更是必然的,也是不可避免的,进度拖延,成本失控,客户有新的需求等都会引起项目的变更。在本项目中,我要求有处于工作状态的产品,开发人员才可以对其任意修改,修改完成后,重新入库即可。

数据知道的博客 6887

Java中的显式锁

本篇主要介绍Java中显式锁的内容

ozawacai的博客 1195

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

24.显式锁-ReentrantLock

显式锁作为Java并发编程领域的一项进阶同步技术,相较于传统的synchronized关键字,在灵活性与控制精细度上实现了显著提升。它在Java的并发编程java.util.concurrent.locks中,通过标准化的Lock接口及其强大实现类——如ReentrantLock,为开发人员构建了一套丰富多维的同步工具集,深度赋能并发控制策略的定制与优化。ReentrantLock等实现不仅沿袭了基本的互斥访问控制,还引入了诸如可重入性、公平性配置、锁中断、以及读写分离等高级特性。

q1372302825的博客 1037

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

23.显式锁-ReentrantLock

想要在并发编程的战场上所向披靡?深入了解ReentrantLock,开启高效同步的新纪元,让你的代码在多线程世界里如虎添翼。点击了解更多,让我们一起探索ReentrantLock那未被完全揭开的神秘面纱!ReentrantLock,作为Java并发包中的一员,是实现锁机制的重量级工具,相较于synchronized关键字,提供了更高的灵活性和可控性。该锁支持公平与非公平两种锁获取模式,允许线程重复获取同一把锁,并要求按相同次数释放,确保了锁的可重入性。

q1372302825的博客 1091

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java并发之显式锁

一.概述 在Java 5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile,我们的选择不多。 但在Java5.0 增加了一种新的机制:ReentratLock ,显式锁。 它并不是一种替代内置加锁的方法,而是当内置加锁机制不适用时,作为一种可选择的高级功能。 二.具体学习 1.Lock与ReentrantLock 1)Lock是个接口,其中定义了一组抽象的加锁操作: public interface Lock{ void lock(); void loc

c1776167012的博客 241

Java显式锁

Java 显式锁。 一、显式锁 什么是显式锁? 由自己手动获取锁,然后手动释放的锁。 有了 synchronized(内置锁) 为什么还要 Lock(显示锁)? 使用 synchronized 关键字实现了锁功能的,使用 synchronized 关键字将会隐式地获取锁,但是它将锁的获取和释放固化了,也就是先获取再释放。 与内置加锁机制不同的是,Lock 提供了一种无条件的、可轮询的、定时的以及可中断的锁获取操作,所有加锁和解锁的方法都是显式的。 二、Lock的常用api 方法名称 描述

IT王小二的博客 254

Java 显式锁

显式锁并不是一种替代内置加锁的方式,而是当内置加锁机制不适用时,作为一种可选择的高级功能。

云原生Java Web领域技术博客 343

Java编程拾遗『显式锁』

在之前讲线程同步时,介绍了synchronized的锁的使用及底层原理,也介绍了synchronized锁的一些使用局限,本篇文章来介绍一下Java中提供的另一种线程同步机制——显式锁。Java并发包中的显式锁接口和类位于包java.util.concurrent.locks下,主要接口和类有: 锁接口Lock,主要实现类是ReentrantLock 读写锁接口ReadWriteLock,主要...

卓立的博客 252

七、显式锁

一、回顾synchronized关键字 synchronized关键字有个名字,叫做内置锁。 为什么有了synchronized关键字还有个显式锁呢? synchronized的形式很固化,因为它必须要拿到锁然后再释放锁,其他拿不到锁的线程就处于一个阻塞状态,我们如果去尝试中断这个线程是中断不了的。换句话说,线程必须要拿到synchronized锁为止,拿不到锁我就不给你中断。 原...

洛阳城下逢公子 208

显式锁与隐式锁的区别

显式锁与隐式锁的区别 解决的方法 格式 描述 同步代码块(关键字) synchronized(锁对象){} 隐式锁,多个线程的锁对象必须唯一 同步方法(修饰符) synchronized 返回类型 方法名(){} 隐式锁,谁调用该方法谁就是锁对象 显示锁 ReentrantLock类的lock()/unlock()方法 显式锁,有程序员决定在那开启/关闭锁 一、构成不同 Sync 和 Lock 的出身(原始的构成)不同: Sync:Java中的关键字,是由JVM来维护的。是J

Shalick的书架 1388

JUC显式锁概述

悲观锁、乐观锁、共享锁、独占锁、公平锁、非公平锁、可重入锁、不可重入锁

CodePanda@GPF的博客 412

PostgreSQL 显式锁机制全解析

PostgreSQL 作为业界领先的开源关系型数据库,采用了 MVCC(多版本并发控制)技术,极大提升了并发性能。但在复杂并发场景下,MVCC 不能完全解决所有数据一致性问题,显式锁(Explicit Locking)机制由此应运而生。它允许开发者以更精细的方式控制资源的访问和修改,保证事务的安全和可靠。PostgreSQL 的锁机制分为自动和显式两类。自动锁由系统根据 SQL 命令自动申请,开发者无需干预。显式锁则需要开发者根据业务需求主动申请,典型场景包括复杂的数据迁移、批量写入、分布式任务调度等。

IT技术学习与工作笔记分享 789
上一篇: 并发性能和可伸缩性
下一篇: 原子变量和非阻塞同步机制
weeweee
博客等级 码龄16年 10粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值