Lock简介与初识AQS

5张图,搞懂三方支付机构的“备付金账户”体系 本文将详细解析第三方支付机构各类备付金账户的功能定位、所承载的支付业务处理流程以及日常管理。 阅读详情

Lock简介
我们下来看concurent包下的lock子包。锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。在Lock接口出现之前,java程序主要是靠synchronized关键字实现锁功能的,而java SE5之后,并发包中增加了lock接口,它提供了与synchronized一样的锁功能。虽然它失去了像synchronize关键字隐式加锁解锁的便捷性,但是却拥有了锁获取和释放的可操作性,可中断的获取锁以及超时获取锁等多种synchronized关键字所不具备的同步特性。通常使用显示使用lock的形式如下:

Lock lock = new ReentrantLock(); lock.lock(); try { … } finally
{
lock.unlock(); }

需要注意的是synchronized同步块执行完成或者遇到异常是锁会自动释放,而lock必须调用unlock()方法释放锁,因此在finally块中释放锁。

Lock接口API

我们现在就来看看lock接口定义了哪些方法:

//获取锁
void lock();
//获取锁的过程能够响应中断
void lockInterruptibly() throws InterruptedException;
//非阻塞式响应中断能立即返回,获取锁放回true反之返回fasle
boolean tryLock();
//超时获取锁,在超时内或者未中断的情况下能够获取锁
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
//获取与lock绑定的等待通知组件,当前线程必须获得了锁才能进行等待,进行等待时会先释放锁,当再次获取锁时才能从等待中返回
Condition newCondition();
// 释放锁。
unlock();

上面是lock接口下的六个方法,也只是从源码中英译中翻译了一遍,感兴趣的可以自己的去看看。那么在locks包下有哪些类实现了该接口了?先从最熟悉的ReentrantLock说起。

public class ReentrantLock implements Lock, java.io.Serializable
全选代码复制
很显然ReentrantLock实现了lock接口,接下来我们来仔细研究一下它是怎样实现的。java培训当你查看源码时你会惊讶的发现ReentrantLock并没有多少代码,另外有一个很明显的特点是:基本上所有的方法的实现实际上都是调用了其静态内存类Sync中的方法,而Sync类继承了AbstractQueuedSynchronizer(AQS)。可以看出要想理解ReentrantLock关键核心在于对队列同步器AbstractQueuedSynchronizer(简称同步器)的理解。

初识AQS

关于AQS在源码中有十分具体的解释:

Provides a framework for implementing blocking locks and related
synchronizers (semaphores, events, etc) that rely on
first-in-first-out (FIFO) wait queues. This class is designed to be
a useful basis for most kinds of synchronizers that rely on a single
atomic {@code int} value to represent state. Subclasses must define
the protected methods that change this state, and which define what
that state means in terms of this object being acquired or released.
Given these, the other methods in this class carry out all queuing
and blocking mechanics. Subclasses can maintain other state fields,
but only the atomically updated {@code int} value manipulated using
methods {@link #getState}, {@link #setState} and {@link
#compareAndSetState} is tracked with respect to synchronization.

Subclasses should be defined as non-public internal helper classes
that are used to implement the synchronization properties of their
enclosing class. Class {@code AbstractQueuedSynchronizer} does not
implement any synchronization interface. Instead it defines methods
such as {@link #acquireInterruptibly} that can be invoked as
appropriate by concrete locks and related synchronizers to implement
their public methods.

全选代码复制
同步器是用来构建锁和其他同步组件的基础框架,它的实现主要依赖一个int成员变量来表示同步状态以及通过一个FIFO队列构成等待队列。它的子类必须重写AQS的几个protected修饰的用来改变同步状态的方法,其他方法主要是实现了排队和阻塞机制。状态的更新使用getState,setState以及compareAndSetState这三个方法。

子类被推荐定义为自定义同步组件的静态内部类,同步器自身没有实现任何同步接口,它仅仅是定义了若干同步状态的获取和释放方法来供自定义同步组件的使用,同步器既支持独占式获取同步状态,也可以支持共享式获取同步状态,这样就可以方便的实现不同类型的同步组件。

同步器是实现锁(也可以是任意同步组件)的关键,在锁的实现中聚合同步器,利用同步器实现锁的语义。可以这样理解二者的关系:锁是面向使用者,它定义了使用者与锁交互的接口,隐藏了实现细节;同步器是面向锁的实现者,它简化了锁的实现方式,屏蔽了同步状态的管理,线程的排队,等待和唤醒等底层操作。锁和同步器很好的隔离了使用者和实现者所需关注的领域。

头歌操作系统 课堂练习4.2:页式内存管理 答案 无解析 阅读详情

相关推荐

API安全攻防实战:从信息搜集到漏洞利用的完整路径

本文详细解析了API安全攻防实战的全过程,从信息搜集到漏洞利用,涵盖了渗透测试的核心技巧和工具使用。通过真实案例展示如何发现和利用API漏洞,如HTTP方法滥用、内容类型转换攻击等,并提供企业级防御策略和测试心得,帮助安全研究人员提升API安全防护能力。

weixin_30394981的博客 434

Lock简介与初识AQS,想找工作的你还不看这份资料就晚了

… } finally { lock.unlock(); } 需要注意的是synchronized同步块执行完成或者遇到异常是锁会自动释放,而lock必须调用unlock()方法释放锁,因此在finally块中释放锁。 Lock接口API 我们现在就来看看lock接口定义了哪些方法: //获取锁 void lock(); //获取锁的过程能够响应中断 void lockInterruptibly() throws InterruptedException; //非阻塞式响应中断能立即返回,获取锁放回true

m0_64205564的博客 230

避坑指南:ANSYS流固耦合计算中System Coupling数据传递设置与常见报错解决

本文深入解析ANSYS Workbench中System Coupling模块在双向流固耦合(FSI)计算中的应用,详细讲解数据传递机制、典型报错解决方案及高阶调试技巧。通过实际案例展示如何优化耦合步长、处理大变形问题,并提升并行计算效率,帮助工程师有效规避常见技术陷阱。

weixin_29213525的博客 722

深入剖析Lock与AQS

1. JUC的基本结构 Java开发人员中,我们一般把java.util.concurrent简称为JUC包,泛指我们日常用到的并发多线程中的知识模块。下图是concurrent包的目录结构图。 其中包含了两个子包:atomic以及lock,另外在concurrent下的阻塞队列以及executors,这些就是concurrent包中的精华。从整体上来看concurrent包的整体实现图如下图所...

南国的技术栈 510

MT4量化交易入门:手把手教你用MQL4编写第一个外汇EA(含完整代码)

本文详细介绍了如何使用MQL4在MT4平台上编写第一个外汇EA,涵盖从开发环境配置到均线交叉策略实现的完整流程。通过手把手教学和完整代码示例,帮助量化交易新手快速掌握外汇自动化交易的核心技术,实现高效的MT4量化交易系统。

mmm90的博客 525

基于YOLO26深度学习框架的文档表格识别系统的算法研究实现方法

本文研究了基于YOLO26深度学习框架的文档表格识别系统实现方法。系统采用YOLO26网络架构,通过数据预处理、模型训练、检测推理和表格分析四个模块实现高效表格识别。研究详细阐述了数据归一化、增强等技术处理,以及采用迁移学习策略优化模型训练过程。实验表明,该系统能有效识别多种表格结构并生成结构化数据,为文档自动化处理提供了可靠解决方案。

一键难忘的博客 970

并发编程(十一)-----Lock简介与初识AQS

concurrent包的结构层次 在针对并发编程中,Doug Lea大师为我们提供了大量实用,高性能的工具类,针对这些代码进行研究会让我们队并发编程的掌握更加透彻也会大大提升我们队并发编程技术的热爱。这些代码在java.util.concurrent包下。如下图,即为concurrent包的目录结构图。 其中包含了两个子包:atomic以及lock,另外在concurrent下的阻塞队列以及ex...

qq_35854212的博客 500

【2026年华为暑期实习(AI)-6月3日-第一题- 选择题】(题目+思路+Java&C++&Python解析+在线测试)

本文摘要: 本文探讨了深度学习与计算机科学中的多个关键概念和技术,包括CUDA双缓冲技术、神经网络训练问题、优化算法、概率模型、Transformer架构特性、量化技术、损失函数选择等。通过20道选择题和多项选择题,涵盖了梯度消失/爆炸、神经元死亡、牛顿迭代法、朴素贝叶斯分类、Adam优化器、KV Cache压缩等核心知识点。特别关注了大模型训练中的计算效率、数值稳定性问题,以及实际应用场景如客服Agent的记忆机制优化。题目设计既考察基础理论(如概率分布、指数分布特性),又结合前沿技术(如MoE架构、注意

m0_73659489的博客 81

多线程 6 —— Lock体系、Lock锁原理(AQS)

一、什么是Lock体系 Lock体系其实是另一类锁的集合,是jdk提供的一种除synchronized之外的加锁方式。 Lock是一个接口,它在java.util.concurrent.locks包下,并且这个包下有很多Lock接口的实现类。 说到java.util.concurrent.locks包,我们先来看看java.util.concurrent包,它是一个解决并发问题的包,通常用在并发编程中。 java.util.concurrent包 ...

yuiop123455的博客 913

铁路场景雷达点云目标识别与追踪系统

本文介绍了一种基于毫米波雷达的铁路货运车站安全监控系统。该系统采用分布式架构,通过多个毫米波雷达节点采集点云数据,经过坐标转换、多雷达融合等处理后,利用机器学习算法实现列车、行人等目标的实时识别与追踪。系统包含数据采集层、处理层、目标识别层、追踪层、预警决策层和可视化层,能够克服传统视频监控受环境影响大的缺点,实现全天候可靠监测。文中详细展示了雷达数据解析和点云预处理的代码实现,包括坐标转换、数据格式解析和体素网格滤波等关键技术。该系统可有效预警铁路场景下的碰撞风险,提升货运车站的安全管理水平。

huanghm88的专栏 124

借助ChatGPT完成课题申报书中框架思路写作指南

通过这篇文章的学习,我们可以让ChatGPT先为用户匹配研究理论、研究方法、研究思路、研究内容等,为申请人提供一些参考,能够帮助对拟申报课题有一个初步的认识。当申请人找到了合适的理论、方法和问题后,再借助精细化提示词模型提问,那ChatGPT回答的启发性肯定会有质的提升,更具有使用价值。

智能AI让学术科研更容易 2467

初识Lock与AbstractQueuedSynchronizer(AQS)

1. concurrent包的结构层次 在针对并发编程中,Doug Lea大师为我们提供了大量实用,高性能的工具类,针对这些代码进行研究会让我们队并发编程的掌握更加透彻也会大大提升我们队并发编程技术的热爱。这些代码在java.util.concurrent包下。如下图,即为concurrent包的目录结构图。 其中包含了两个子包:atomic以及lock,另外在concurrent下的阻塞...

你听___ 464

YOLOv12 改进 | Backbone改进 3

将CSP中的简单拼接改为可学习的特征选择门控,动态决定哪些特征流向下一层,同样再写这篇。:相比静态CSP的固定50/50分割,门控机制可学习0.3:0.7等最优比例。在输入端加入轻量SR模块,对下采样后的特征进行超分恢复,提升小目标检测能力。(小目标): 从 0.51 AP → 0.63 AP (+24%):采用ESPCN的高效亚像素卷积,避免传统插值的信息损失。:从通道级(SE)到空间级(Spatial)的多粒度控制。:结合浅层细节和深层语义,恢复小目标的纹理信息。

u012133341的博客 839

Java并发编程系列---Lock接口和AQS初识

一、 java中的锁 1.1 什么是锁 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同 时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁)。在 Lock接口出现之前,Java程序是靠synchronized关键字实现锁功能的,而Java SE 5之后, 并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized...

逆流而上的博客 1735

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

OV9734 DATASHEET,完整规格书

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

JUC基础(三)—— Lock锁 及 AQS

我们第一章提到了JUC的几大组成部分,其中就包含了“锁”,实际上Lock锁在业务上的使用频率恐怕是最高的,它弥补了很多synchronized关键字无法顾及的场景,灵活而强大。今天我们就来看一看这个强大的Lock以及它的核心类

战斧的博客 3460

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java---Lock锁(AQS与Lock区别)

什么是Lock锁? 在Java中锁是出现是为了防止多个线程访问同一资源,锁有内建锁(synchronized),synchronized关键字实现锁是隐式加解锁,在JDK5后,java.util.concurrent包中增加了lock接口,它提供了和synchronized一样可以防止多个线程访问同一资源,但是lock锁需要手动加锁解锁,也提供了synchronized没有的同步特性(后文会叙述)...

sophia__yu的博客 3192

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java并发-AQS及各种Lock锁的原理

什么是AQS AQS是AbustactQueuedSynchronizer的简称,它是一个Java提高的底层同步工具类,用一个int类型的变量表示同步状态,并提供了一系列的CAS操作来管理这个同步状态。AQS的主要作用是为Java中的并发同步组件提供统一的底层支持,例如ReentrantLock,CountdowLatch就是基于AQS实现的,用法是通过继承AQS实现其模版方法,然后将子类作为同...

不瘦十斤不换名字 3万+

并发--AQS VS Lock & tryLock() VS lock() & tryAcquire() VS acquire()

摘要:本文剖析了Java并发编程中AQS与Lock的层级关系。AQS作为底层框架,为Lock接口实现类(如ReentrantLock)提供核心并发控制机制,采用"组合+继承"设计模式。重点对比了tryAcquire()与acquire()方法:前者由子类实现具体锁获取逻辑,后者是包含队列管理的模板方法。同时分析了Lock接口的tryLock()和lock()方法差异,前者通过tryAcquire()非阻塞尝试获取锁,后者使用acquire()确保获取成功。文章通过调用关系图展示了这些方法的协作机制,揭示了

你我约定有三的博客 1171

Java中的Lock与AQS

------------本文结束感谢您的阅读------------

zqhao的博客 1637

Lock 和 AQS

文章目录Lock 和 AQSLock接口AQSAQS同步器原理 Lock 和 AQS Lock接口 Lock实现提供比使用synchronized方法和语句可以获得的更广泛的锁定操作。它们允许更灵活的结构化,可能具有完全不同的属性,并且可以支持多个相关联的对象Condition。 Lock接口提供的方法操作: void lock() 获取锁,如果锁被使用会一直阻塞直至获取到锁。 void lockInterruptibly() throws InterruptedException 如果当前线程

WYSCODER的博客 659

Lock锁和AQS之间的关系与区别:基于第一原理的深入分析

第一原理,英文为First Principle,是指从最基本的事实或假设出发,进行逻辑推导,得出结论。它强调回归事物的本质,通过解构分析找到实现目标的最优路径。AQS是Java并发包中的一个抽象类,用于构建锁和其他同步组件的基础框架。它使用了一个整型变量state来表示同步状态,并通过内置的FIFO队列来管理获取资源的线程。管理同步状态:通过state变量表示资源是否被占用。线程排队:当线程获取资源失败时,将其加入等待队列。唤醒机制:当资源被释放时,唤醒等待队列中的线程。java复制代码。

喜欢猪猪 1809

Java的Lock接口与AQS原理详解

(简称 AQS)是 Java 并发包中实现锁和其他同步组件的基础框架,它位于包中。AQS 提供了一个基于 FIFO 队列的同步机制,通过维护一个状态变量(int state)和一个线程等待队列来实现锁的获取和释放。Lock接口为 Java 提供了更灵活的锁控制机制,而 AQS 作为实现锁和其他同步组件的基础框架,通过维护状态变量和等待队列,为锁的实现提供了强大的支持。和是基于 AQS 实现的典型锁,它们在不同的场景下可以发挥出各自的优势,提高程序的并发性能。

dsq_MaDing的博客 500
上一篇: jquery常见事件动画
下一篇: 一文详解Hive的谓词下推
IT小谷
博客等级 码龄5年 33粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值