Is this you? As a journalist, you can create a free Muck Rack account to customize your profile, list your contact preferences, and upload a portfolio of your best work.
Claim your profile
Articles by Node nextWaiter
深入源码解析 ReentrantLock、AQS:掌握 Java 并发编程关键技术
介绍 ReentrantLock、AQS 之前,先分析它们的来源,来自于 JUC 中的核心组件,java.util.concurrent 在并发编程中是比较会常用的工具类,里面包含了很多在并发场景下使用的组件,比如:线程池 > ThreadPoolExecutor、阻塞队列 > BlockingQueue、计数器 > CountDownLatch、循环屏障 > CyclicBarrier、信号量 > Semaphore、并发集合 > ConcurrentHashMap | CopyOnWriteArrayList |ConcurrentSkipListMap 等 ReentrantLock 与 synchronized 具有相同的基本行为、语义,但它扩展了一些其他的功能且更能灵活控制锁 在该篇博文主要介绍 ReentrantLock 是如何实现的,以及它的核心方法源码,如何结合 AQS 实现锁解决并发安全问题的 Lock 是 JUC 组件下最核心的接口,绝大部分组件都使用到了 Lock 接口,所以先以 Lock 接口作为切入点讲解后续的源码 Lock...
JUC同步锁原理源码解析三----CountDownLatch、CyclicBarrier - bug的自我救赎 - 博客园
CountDownLatch、CyclicBarrier的来源 1.CountDownLatch的来源 A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes. CountDownLatch的出现是为了一个或者多个线程等待一系列操作完成后,继续往下执行。因而在日常工作中最经常使用的场景:一个大任务需要等待子任务完成后,继续往后执行其他操作。 2.CountDownLatch的底层实现 CountDownLatch的底层实现依旧依赖于AQS的共享锁机制。 3.CyclicBarrier的来源 A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point.
JUC同步锁原理源码解析二--ReentrantReadWriteLock - bug的自我救赎 - 博客园
1.读写锁的来源 在开发场景下,对于写操作我们为了保证原子性所以需要上锁,但是对于读操作,由于其不改变数据,只是单纯对数据进行读取,但是每次都上一把互斥锁,阻塞所有请求。这个明显不符合读多写少的场景。所以将锁分为两把:读锁和写锁。 2.读写锁的底层实现 读写锁的底层实现依旧依赖于AQS。具体底层实现,请查看上一篇文章的介绍 2.AQS源码 Node节点 static final class Node { /** Marker to indicate a node is waiting in shared mode */ static final Node SHARED = new Node(); /** Marker to indicate a node is waiting in exclusive mode */ static final Node EXCLUSIVE = null; /** waitStatus value to indicate thread has cancelled */ static final int CANCELLED = 1; /**...
JUC同步锁原理源码解析一 之ReentrantLock
1.锁的本质 1.什么是锁? 通俗来讲,锁要保证的就是原子性,就是一个代码块不允许多线程同时执行,就是锁。从生活的角度上来说,就比如你要去上厕所,当你在上厕所期间,你会把门锁上,其他人只能排队。不允许多个人同时上厕所。 2.锁的底层实现 java语言是运行在jvm之上,jvm是由C++实现的。java本身没有对应的底层锁实现,它将锁的问题抛给了C++。C++将锁的实现抛给了汇编语言,汇编语言将问题抛给操作系统。所以最后还是由操作系统提供的cmpxchg指令。通过 lock cmpxchg指令实现了cpu对于单个变量的原子操作。lock cmpxchg涉及到缓存一致性协议(MESI)与总线锁。(个人能力有限,自行了解吧) 3.什么是自旋锁 线程不停执行某一个代码块,直到满足条件或者操作重试次数,也就是我们所说的CAS。 4.如何实现一把锁 1.状态:判断当前是有锁还是无锁? boolean state = true/false;标识有锁与无锁。但是一旦有锁冲入的情况,我们就需要引入一个新的变量去存储锁冲入的次数。所以JUC中使用int...
从ReentrantLock角度解析AQS-51CTO.COM
2023-04-14 08:39:01 本文主要提供了从ReentrantLock出发,解析了AQS中的各种公用的方法,如果需要知道其他类中怎么去使用AQS中的方法,其实也只需要找到切入点,一步步调试下去即可,不过,我想很多地方都是和ReentrantLock中一致的。 一、概述 闲来不卷,随便聊一点。 一般情况下,大家系统中至少也是JDK8了,那想必对于JDK5加入的一系列功能并不陌生吧。那时候重点加入了java.util.concurrent并发包,我们简称JUC。JUC下提供了很多并发编程实用的工具类,比如并发锁lock、原子操作atomic、线程池操作Executor等等。下面,我对JUC做了整理,大致分为下面几点: 基于JDK8,今天重点来聊下JUC并发包下的一个类,AbstractQueuedSynchronizer。 首先,浅显的从名字上看,抽象的队列同步器;实际上,这名字也跟它的作用如出一辙。抽象,即需要被继承;队列同步器,其内部维护了一个队列,供线程入队等待;最终实现多个线程访问共享资源的功能。 二、源码解析...
15.AQS的今生,构建出JUC的基础 - 王有志 - 博客园
《AQS的前世,从1990年的论文说起》中我们已经对AQS做了简单的介绍,并学习了先于AQS出现的3种基于排队思想的自旋锁。今天我们深入到AQS的设计中,探究Doug Lea是如何构建JUC框架基础组件的。不过在正式开始前,我们先来回顾上一篇中提到的面试题: 原理相关:AQS是什么?它是怎样实现的? 设计相关:如何使用AQS实现Mutex? 希望今天可以帮你解答上面的问题。 Tips: 本文基于Java 11完成,与Java 8存在部分差异,注意区分; Doug Lea The java.util.concurrent Synchronizer Framework 2004 非常幸运,2017年就有大佬完成了论文的翻译:《The java.util.concurrent Synchronizer Framework》 JUC同步器框架(AQS框架)原文翻译 初衷与目的 《The java.util.concurrent Synchronizer Framework》中清晰的阐述了Doug Lea设计AQS的目的:...
一文就懂AQS!
分享 生成长图 转Word 打印 朗读 全屏 修改 转藏+1 【原】一文就懂AQS! 流楚丶格念 2023-02-23 发表于河北 | 转藏 大 中 小 AQS概念 AbstractQueuedSynchronized(AQS),是抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架**,许多同步类实现都依赖于它,例如常用的ReentrantLock/Semaphore/CountDownLatch等 AQS是一个用来构建锁和其他同步组件的基础框架,使用AQS可以简单且高效地构造出应用广泛的同步器,它提供了一个FIFO队列(先进先出队列),可以看成是一个用来实现同步锁以及其他涉及到同步功能的核心组件。 模型整体的工作流程如下所示: AQS模式分类 AQS支持独占锁(exclusive)和共享锁(share)两种模式。 独占锁:只能被一个线程获取到(例如:Reentrantlock) 这其中又可分为公平锁和非公平锁: 公平锁:按照线程在队列中的排队顺序,先到者先拿到锁 非公平锁:当线程要获取锁时,无视队列顺序直接去抢锁,谁抢到就是谁的...
Java面试--AQS_aqs面试题_北极星小王子的博客-CSDN博客
AQS 全名 AbstractQueuedSynchronizer,意为抽象队列同步器,JUC(java.util.concurrent 包)下面的 Lock 和其他一些并发工具类都是基于它来实现的。AQS 维护了一个 volatile 的 state 和一个 CLH(FIFO)双向队列 2.1、state AQS 使用一个 int 成员变量来表示同步状态,通过内置的 FIFO 队列来完成获取资源线程的排队工作。AQS 使用 CAS 对该同步状态进行原子操作实现对其值的修改 private volatile int state; 状态信息通过 protected 类型的 方法进行操作 getState() setState() compareAndSetState() getState:返回同步状态的当前值 protected final int getState() { return state; } setState:设置同步状态的值 protected final void setState(int newState) { state = newState; }...
Show More
loading
Actions
Is this you?
As a journalist, you can create a free Muck Rack account to customize your profile, list your contact preferences, and upload a portfolio of your best work.Get in touch with Node
Contact Node, search articles and posts on X, monitor coverage, and track replies from one place.
Learn more about Muck Rack