ReentrantLock实现原理详解

【多线程】轻松彻底搞懂ReentrantLock的底层实现原理 上篇博客讲解了Sychronized的底层实现原理,它是基于jdk实现的,现在此篇博客讲解基于AQS 框架实现的另一个锁ReentrantLock。 阅读详情

ReentrantLock是Java并发包中用于实现可重入锁的类,基于AQS(AbstractQueuedSynchronizer,抽象队列同步器)实现,支持公平锁和非公平锁。

  1. 类结构与AQS基础:ReentrantLock内部有Sync、FairSync和NonFairSync三个内部类。Sync继承自AQS,是公平锁和非公平锁的抽象父类;FairSync和NonFairSync分别实现公平锁和非公平锁。AQS是构建锁和同步器的框架,维护一个FIFO等待队列来管理等待获取资源的线程,通过一个volatile修饰的int类型变量state表示同步状态。不同同步器中,state含义不同,在ReentrantLock中,state表示锁被同一个线程重复获取的次数,0代表未锁定,大于0表示已锁定,数值为获取次数。
  2. 加锁流程
    • 非公平锁加锁:创建ReentrantLock时若不传入参数,默认使用非公平锁(NonFairSync) 。调用lock()方法时,先通过CAS操作尝试将AQS中的同步状态state从0修改为1。若修改成功,将当前线程设置为锁的独占所有者;若失败,调用AQS的acquire(1)方法。acquire(1)方法中,再次调用tryAcquire(1)尝试获取锁(实际调用NonFairSync的nonfairTryAcquire方法 ),该方法先检查state是否为0,是则尝试用CAS将state设为1并设置当前线程为锁的所有者;若state不为0且当前线程是锁的持有者,则将state值增加1,体现可重入特性;若都不满足则返回false。当tryAcquire返回false,执行acquireQueued方法,将当前线程封装成Node节点加入AQS等待队列,然后进入自旋尝试获取锁。若当前节点的前驱节点是头节点且能成功获取锁,则将当前节点设为头节点;否则根据前驱节点的waitStatus值判断是否挂起当前线程。
    • 公平锁加锁:公平锁(FairSync)的lock()方法直接调用AQS的acquire(1)方法。在tryAcquire方法中,除了检查state状态,还会调用hasQueuedPredecessors()方法检查等待队列中是否有其他线程在排队。只有等待队列中没有前驱节点(即没有其他线程先于当前线程等待获取锁),并且能通过CAS操作将state从0修改为1时,当前线程才能获取到锁;否则线程会被加入到等待队列。这确保了线程获取锁的顺序是按照在队列中的等待顺序,实现公平性。
  3. 解锁流程:解锁时调用unlock()方法,实际调用AQS的release(1)方法。release(1)方法内部先调用tryRelease(1)尝试释放锁(在ReentrantLock的Sync类中实现 ),检查当前线程是否是持有锁的线程,若是则将state值减1。当state值变为0时,代表锁已完全释放,将持有锁的线程清空,并返回true。若tryRelease返回true,AQS会调用unparkSuccessor方法唤醒等待队列中的下一个线程(通过LockSupport.unpark()操作 )。
  4. 可重入的实现:由于ReentrantLock是可重入锁,同一线程可多次获取同一把锁。当已持有锁的线程再次调用lock()方法时,会识别出当前线程是锁的持有者,然后将AQS中的state值加1。释放锁时,每次unlock()操作会将state值减1,直到state值为0时,才真正释放锁。这一机制通过在tryAcquire和tryRelease方法中对state值的增减操作实现,保证了同一线程多次获取锁时不会被阻塞。
  5. 公平锁与非公平锁区别
    • 公平锁:在获取锁时,会检查等待队列中是否有其他线程在排队,只有当前线程是等待队列中第一个请求锁的线程时,才会尝试获取锁,确保了线程获取锁的公平性。但由于需要频繁检查队列,上下文切换开销较大,在高并发场景下性能相对较低。
    • 非公平锁:获取锁时先通过CAS尝试获取,不考虑等待队列中的线程。若获取失败,再进入等待队列。这种方式可能会使新线程“插队”获取锁,导致等待队列中的线程等待时间延长,但减少了线程挂起和唤醒的开销,在高并发场景下性能更好。ReentrantLock默认使用非公平锁,因为多数场景下性能更为重要。
JAVA多线程详解(三):ReentrantLock实现原理与源码分析 刚学java的多线程通信时,往往只能知道在多线程访问共享资源时加上锁,保证多线程访问共享资源时的同步操作。利用ReentrantLock的lock()方法加锁,利用ReentrantLock的unlock()方法释放锁。那么加锁和释放锁的内部是怎么实现的呢?其源码解释的比较清晰。下面将从源码的整体架构和具体细节来分析ReentraLock的实现原理。由于大量使用了CAS操作,先介绍CAS的实现原理... 阅读详情

相关推荐

Codex登录要手机验证码?Cockpit Tools跳过验证保姆级教程

摘要:OpenAI升级风控后,Codex登录需手机验证,增加批量账号使用成本。CockpitTools(GitHub 8.3k star)可绕过验证,支持多AI编程平台账号管理。操作步骤:1) 获取ChatGPT网页Session数据;2) 通过转换工具生成CPA格式JSON;3) 导入工具启动Codex。注意:仅适用于未绑定手机号的账号,Session会过期,且需防范数据泄露风险。商业账号通常直接提供认证文件。(150字)

5840

8. 共享模型之工具-J.U.C工具包-ReentrantLock 原理

AQS 原理 1. 概述 全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架 特点: 用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁 getState - 获取 state 状态 setState - 设置 state 状态 compareAndSetState - cas 机制设置 state 状态 独占模式是只有一个线程能够访问资源,而共享模式可以允许多个线程访问资源 提供了基于 F

liuhehe的博客 529

告别调参玄学:用 DINOv2 (ViT-S/ViT-G) 和 PCA 可视化,直观理解自监督特征

本文深入解析了DINOv2(ViT-S/ViT-G)模型在自监督学习中的特征提取机制,通过PCA降维技术实现特征空间的可视化。文章对比了不同规模模型的特征表达差异,并提供了PCA阈值调优和深度分析的实用技巧,帮助读者直观理解自监督学习的视觉密码。

weixin_42565865的博客 409

ReentrantLock原理及详细的使用方法

的核心是基于AQS(抽象队列同步器)实现的。AQS 维护了一个队列,用于管理所有请求锁的线程。每个线程尝试获取锁时,如果当前锁被其他线程持有,则进入等待队列,阻塞等待锁释放。一旦锁释放,AQS 会从队列中唤醒下一个线程,允许它获取锁。提供了比更灵活的锁控制方式。选择公平锁和非公平锁;提供尝试获取锁和可中断的锁;允许锁的重入;支持手动加锁和解锁的细粒度控制。

yymagicer的博客 2345

VSCODE编辑+EIDE插件调试+STM8_Debug插件调试+IAR_STM8工具链编译开发项目

1. 安装 在VS CODE安装EIDE、STM8-Debug插件 2. 使用 EIDE 创建一个 8/16 Bit MCU 项目 新建虚拟文件夹,把工程外部的文件添加进虚拟文件夹,实现工程和源文件之间的关系,而不用实际把源文件复制到工程目录下。 EIDE工程和源文件实现分开放置,EIDE(EIDE工程)、EWSTM8(IAR STM8工程)、Project(ST Visual Develop工程) 选择工具链 烧录工具选择 头文件包含目录 添加宏定义 3. 编译 4. 使用STM8

TrueLink的博客 5500

卸载python弹框报错:Could not set file security for file ‘D:\Config.Msi\abd5.rbf‘. Error: 5. Verify...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 6480

重点,一文掌握ReentrantLock加解锁原理!|原创

本文详细讲解了 ReentrantLock 加锁和释放锁的原理,以及和 Synchronized 的对比。本文较长,建议收藏!点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达简要总结 ReentrantLock实现原理:volatile 变量 + CAS设置值 + AQS + 两个队列实现阻塞:同步队列 + CAS抢占标记为 valatile 的 state实现等待唤醒:await ...

Daniel的博客 1011

openbmc mctp i3c适配步骤

本文介绍了在Intel OKS平台下,BMC作为I3C从设备如何适配MCTP over I3C的实现方法。主要内容包括:1)关键术语解释,如MDB(Mandatory Data Byte)值为0xAE,DCR(Device Characteristics Register)和BCR(Bus Characteristics Register)的设置;2)适配流程说明,包括BMC作为控制器主节点分配地址后成为MCTP端点,CPU作为总线所有者的角色转换;3)测试验证步骤,展示通过mctp-client工具发送指

wit_yuan的专栏 132

Java线程并发中的锁——ReentrantLock(重入锁)原理详解

ReentrantLock是一个重入锁,可以支持一个线程对资源重复加锁,他还支持公平加锁和非公平加锁。synchronized关键字也隐式的支持重进入,比如一个synchronized修饰的递归方法,在方法执行时,执行线程在获取了锁之后仍能连续多次地获得该锁ReentrantLock虽然没能像synchronized关键字一样支持隐式的重进入,但是在调用lock()方法时,已经获取到锁的线程,能够再

路漫漫,水迢迢 9015

【S32K3 MCAL配置】-4.1-CAN Driver:如何解决CAN帧发送丢帧问题

【S32K3 MCAL配置】-4.1-CAN Driver:如何解决CAN帧发送丢帧问题

「汽车电子助手」的博客 1440

Hermes接入IMA知识库全攻略:将知识库装进你的Hermes智能体

本文详细介绍了如何将IMA知识库功能接入Hermes Agent平台,实现一站式笔记管理和知识库操作。主要内容包括:获取IMA访问凭证、下载技能包、配置凭据(支持文件和环境变量两种方式)、验证配置有效性,以及实际应用演示(查询知识库列表、创建笔记并添加到知识库)。文章还提供了常见问题解决方案,如认证失败处理、版本更新等。通过该集成,用户可在Hermes中直接调用IMA的笔记创建、知识库管理等强大功能,提升工作效率。

小石头的专栏 641

简单实现ReentrantLock,详解ReentrantLock底层原理

AbstractQueuedSynchronizer类不止服务于ReentrantLock类,因此该类里面有很多跟ReentrantLock不想关的代码存在,本文将提取ReentrantLock类和AbstractQueuedSynchronizer类的核心代码进行解释说明。本文末尾将附带经过我提取的手写的ReentrantLock代码,代码上附有我对该锁的理解的注解。的核心就是类,要了解就要先了解一、AbstractQueuedSynchronizer类。

duan614的博客 1897

ESP32-IDF开发之旅 网络篇⑩ Web配网

本文介绍了基于ESP32S3的Web配网实现方案。作者通过移植开源项目,在ESP32S3上实现了WiFi配置功能,包括AP模式创建、HTTP服务器搭建、NVS存储读写等核心功能。文章详细解析了代码结构,包含WiFi初始化、事件处理、NVS存储管理和HTML页面服务等关键模块。实现方案采用AP+STA双模式,支持通过网页扫描WiFi并保存配置信息,适用于物联网设备的网络配置场景。代码中使用了FreeRTOS任务、ESP-IDF事件组等技术,并提供了完整的错误处理和日志记录功能。

单片机菜鸟哥的博客 350

ReentrantLock 实现原理详解

u013332124的专栏 639

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

详解synchronized 和ReentrantLock两种锁实现原理

概述 Java 中的并发锁大致分为隐式锁和显式锁两种。隐式锁就是我们最常使用的 synchronized 关键字,显式锁主要包含两个接口:Lock 和 ReadWriteLock,主要实现类分别为ReentrantLock 和 ReentrantReadWriteLock,这两个类都是基于AQS(AbstractQueuedSynchronizer) 实现的。还有的地方将CAS也称为一种锁,...

ly199108171231的博客 4502

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【Java第80集】java ReentrantLock底层实现原理详解

的核心实现依赖于 AQS,它是 Java 并发包中的基础框架,用于构建锁和同步器。state 变量表示锁的状态。state = 0:锁未被占用。state > 0:锁被占用,数值表示重入次数。等待队列(CLH 队列):维护等待锁的线程队列,遵循 FIFO 原则(公平锁)或允许插队(非公平锁)。的底层实现基于 AQS 框架,通过state变量管理锁状态,结合 CLH 队列实现线程排队。可重入性:通过 state 计数器实现。公平性选择:支持公平锁和非公平锁。高级功能。

学不可以已,活到老,学到老。 812

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java中synchronized和ReentrantLock锁的实现原理详解

维度OS层面相同(最终都是futex)相同(最终都是futex)用户态优化锁升级(偏向/轻量级/重量级)AQS队列+CAS自旋公平性非公平(实现决定)可选择功能基础丰富(可中断、超时、条件等)性能低竞争时更优高竞争时可能更优核心结论两者的操作系统底层机制本质相同,都是基于互斥锁和条件变量性能差异主要来自用户态的实现策略(锁升级 vs AQS)更适合简单场景,依赖JVM优化提供更多控制和可预测性这解释了为什么在低竞争时可能更快(得益于锁升级),而在高竞争时。

学亮编程手记 606

Java 并发编程进阶:ReentrantLock 实现原理详解

在 Java 并发编程中,最常见的加锁方式莫过于 synchronizedsynchronized 使用简单,并且由 JVM 保证锁的获取与释放,是 Java 中最基础的线程同步机制不过随着并发场景越来越复杂,synchronized 的局限性也逐渐显现出来:无法尝试获取锁无法设置获取锁超时时间无法中断等待锁的线程不支持公平锁只能使用单一条件队列。

m0_71751187的博客 408

【并发编程】详解 ReentrantLock:深入剖析 AQS 支撑下的可重入锁机制与实现原理

【并发编程】详解 ReentrantLock:深入剖析 AQS 支撑下的可重入锁机制与实现原理

赵士杰——成功并非一蹴而就,而是在持之以恒的努力中逐渐实现。 3363

JAVA多线程系列--ReentrantLock实现原理-AQS详解

1.概述  前文笔者已经讲了ReentrantLock的使用,在这篇文章中我们将讲讲ReentrantLock的底层实现AbstractQueuedSynchronized(AQS)。   AQS:抽象的队列式的同步器。AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch。2.AQS框架

niyuelin1990的博客 624

如何应对Android面试官->AQS原理和volatile详解,手写ReentrantLock核心实现

AbstractQueuedSynchronizer,JDK提供的一个抽象类;这些全是 AbstractQueuedSynchronizer 的子类;AbstractQueuedSynchronizer 是 JDK 中用来构建同步并发的基础组件;AQS 中有一个比较重要的同步变量:private volatile int state // 同步状态;不管是 JDK 还是我们自己,在实现一个同步类的时候,都要围绕着这个 state 来做文章,修改它的值来表示当前的同步状态发生了变化;

IT_Android的博客 1049

ReentrantLock 源码分析

java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这些行为的抽象就是基于AbstractQueuedSynchronizer(简称AQS)实现的,AQS是一个抽象同步框架,可以用来实现一个依赖状态的同步器。JDK中提供的大多数的同步器如Lock, Latch, Barrier等,都是基于AQS框架来实现的一般是通过一个内部类Sync继承 AQS将同步器所有调用都映射到Sync对应的方法。

weixin_39165055的博客 1256

ReentrantLock实现原理与使用风险

ReentrantLock 提供了比 synchronized 更灵活的锁机制,但同时也带来了更大的复杂性和责任。正确管理锁的生命周期- 确保在 finally 块中释放锁避免死锁- 使用超时机制和统一的锁获取顺序合理选择公平性- 非公平锁性能更好,公平锁避免饥饿控制锁粒度- 保持临界区代码简短考虑性能影响- 在高度竞争的场景下评估性能需求正确使用 ReentrantLock 可以构建高效、可靠的并发程序,但需要开发者对并发编程有深入的理解。

weixin_46322148的博客 424

ReentrantLock源码分析

  前言      之前这篇关于AQS的源码分析的文章:AbstractQueuedSynchronizer&amp;CountDownLatch源码分析 不够详细,这篇文章再次从ReentrantLock出发来深入分析AQS的源码。可以先看看之前那篇文章大概了解一下AQS,再来看这篇文章。      ReentrantLock加锁过程      ReentrantLock默认使用非公平锁,这里先...

li123128的博客 157

ReentrantLock 原理

循环,找出当前节点的前驱节点定义为p,此时p就是哑元节点,此时 p == head,再次尝试获取锁(如果当前节点是排在第二位的节点,就可以尝试再次加锁),如果尝试加锁成功。先将当前节点的状态设置为0,进入enq(node)方法,将node挂在到阻塞队列末尾,返回node的前驱节点(Thread-3)记为p,将p的状态设置为-1,然后返回true。将关联s线程(刚才关联Thread-1线程的节点)的节点设置为头节点(删除之前的头节点,将此节点关联的线程改为null)

一+一加1的博客 2059
上一篇: 进程同步和线程的同步
下一篇: AQS原理详解
java烤冷面
博客等级 码龄4年 177粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值