ReentrantLock释放锁源码
2019独角兽企业重金招聘Python工程师标准>>>
public void unlock() {sync.release(1);
}
ReentrantLock
释放锁实际上是调用AbstractQueuedSynchronizer
的release()
方法
public final boolean release(int arg) {if (tryRelease(arg)) {Node h = head;if (h != null && h.waitStatus != 0)unparkSuccessor(h);return true;}return false;
}
tryRelease()
方法是释放锁,释放完成后,查看队列是否存在,如果存在就唤醒队列以后的线程
protected final boolean tryRelease(int releases) {int c = getState() - releases;if (Thread.currentThread() != getExclusiveOwnerThread())throw new IllegalMonitorStateException();boolean free = false;if (c == 0) {free = true;setExclusiveOwnerThread(null);}setState(c);return free;
}
每释放一次锁,就会把state
(锁的状态)减1,直到state
等于0,锁被完全释放,该方法就会返回true
private void unparkSuccessor(Node node) {/** If status is negative (i.e., possibly needing signal) try* to clear in anticipation of signalling. It is OK if this* fails or if status is changed by waiting thread.*/int ws = node.waitStatus;if (ws < 0)compareAndSetWaitStatus(node, ws, 0);/** Thread to unpark is held in successor, which is normally* just the next node. But if cancelled or apparently null,* traverse backwards from tail to find the actual* non-cancelled successor.*/Node s = node.next;if (s == null || s.waitStatus > 0) {s = null;for (Node t = tail; t != null && t != node; t = t.prev)if (t.waitStatus <= 0)s = t;}if (s != null)LockSupport.unpark(s.thread);
}
获取当前线程节点的后置节点,如果后置节点不为空且状态为阻塞,则唤醒后置节点线程,如果后置节点为空或者状态不是阻塞,就从队列的尾节点,从后往前找离当前线程节点最近且状态被阻塞的节点,并唤醒它
转载于:https://my.oschina.net/chenbkit/blog/1611217
ReentrantLock释放锁源码相关推荐
- Java Review - 线程池资源一直不被释放案例源码分析
文章目录 概述 问题复现 源码分析 小结 概述 在日常开发中为了便于线程的有效复用,经常会用到线程池,然而使用完线程池后如果不调用shutdown关闭线程池,则会导致线程池资源一直不被释放. 下面通过 ...
- ReentrantLock之公平锁源码分析
本文分析的ReentrantLock所对应的Java版本为JDK8. 在阅读本文前,读者应该知道什么是CAS.自旋. 本文大纲 1.ReentrantLock公平锁简介 2.AQS 3.lock方法 ...
- 深入剖析ReentrantLock公平锁与非公平锁源码实现
原文地址: https://blog.csdn.net/lsgqjh/article/details/63685058 ReentrantLock是JUC包中重要的并发工具之一,支持中断和超时.还支持 ...
- java并发编程基础-ReentrantLock及LinkedBlockingQueue源码分析
ReentrantLock是一个较为常用的锁对象.在上次分析的uil开源项目中也多次被用到,下面谈谈其概念和基本使用. 概念 一个可重入的互斥锁定 Lock,它具有与使用 synchronized 相 ...
- Redisson 分布式锁源码 11:Semaphore 和 CountDownLatch
前言 Redisson 除了提供了分布式锁之外,还额外提供了同步组件,Semaphore 和 CountDownLatch. Semaphore 意思就是在分布式场景下,只有 3 个凭证,也就意味着同 ...
- 公平锁与非公平锁源码对比
语义: 1.公平锁:每个线程在获取锁的时候,会先检查该锁维护的等待队列,如果该队列是空或者当前线程是第一个,则占有锁,否则按照FIFO的原则,进入等待队列,等待获取锁: 2.非公平锁:当前线程在获取锁 ...
- Linux线程同步(三)---互斥锁源码分析
先给自己打个广告,本人的微信公众号:嵌入式Linux江湖,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题. 一 源码分析 1.li ...
- 基于后端开发Redisson实现分布式锁源码分析解读
一.分布式锁的概念和使用场景 分布式锁是控制分布式系统之间同步访问共享资源的一种方式. 在分布式系统中,常常需要协调他们的动作.如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问 ...
- ReentrantLock acquire方法源码解析
public final void acquire(int arg) {if (!tryAcquire(arg) &&acquireQueued(addWaiter(Node.EXCL ...
- java锁源码分析-1获取锁的过程
这篇文章(包括后边两篇)是六月份写的,写完后由于工作较忙,草稿一致没时间修改,今天偶尔翻到,担心哪天弄丢了,于是先以草稿的形式发布,内容有瑕疵,等以后有时间再修复. 解读类的结构 首先来看类的继承关系 ...
最新文章
- linux差分备份,完全和差分备份的自动化模型
- java好还是python好-Python和Java该如何选择?选哪个好?
- C++ Primer 5th笔记(chap 18 大型程序工具) 重载与命名空间
- Recommended Journals for MPhil degree at Business Model Innovation Group
- 计算机系统的可靠性可以用什么来表示,系统分析师考试计算机系统的可靠性指标...
- C需语言程序中的基本控制结构有哪些,C语言程序的基本控制结构1.ppt
- chromebook刷机_如何在Chromebook上拍照
- [Windows]_[0基础]_[Release程序的崩溃报告minidump解决方式]
- JavaFX 2.0布局窗格– BorderPane
- [css] 有用过scss和sass吗?说说它们之间的区别是什么?
- 如何用stata画莫兰散点图_吃下这颗安利:STATA
- Veeam FAQ系列转载(四)
- saltstsck执行sls配置
- 文件名变乱码. 不知道如何恢复呢?
- npm加速器、github加速器
- java端口扫描器 demo_端口扫描器的设计与实现(java)
- CSFB和SRVCC
- 仪器计量校准机构的CNAS和CMA有哪些区别?分别具有什么作用?
- 洛谷P1359租用游艇
- c++类与对象(一)