AQS框架实现类学习

轻松理解AQS框架 |不会有人看了不懂吧 本文作者:可乐可乐可,博主个人主页:可乐可乐可的个人主页 轻松理解AQS框架 本文需要以下知识铺垫:Java、临界区、信号量、锁 AQS(AbstractQueuedSynchronizer,抽象队列同步器)是Java中重入锁ReentrantLock、读写锁、信号量的实现基石。 学会、了解AQS框架对了解Java锁有很大的帮助 说的比唱的好听,AQS源码下来2k+行,这是人干的活吗? 为了解决大家AQS不了解以及看了忘,忘了看的恶性循环,下面将带领大家从简到繁,一步步的学会AQS框架。 本文. 阅读详情

CountDownLatch:允许一个或者多个线程等待其他线程完成操作

/**
 * <p>
 * </p>
 * @author jinxindong 2016年11月1日 上午9:33:46
 * @version V1.0
 */
public class CountDownLatchDemo {
	
	final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	public static void main(String[] args) throws InterruptedException {
		CountDownLatch countDownLatch = new CountDownLatch(2);//计数数量
		Worker worker1 = new Worker("zhang san", 5000, countDownLatch);
		Worker worker2 = new Worker("li si", 8000, countDownLatch);
		worker1.start();//
		worker2.start();//
		countDownLatch.await();//如果计数到达零,则释放所有等待的线程。
		System.out.println("all work done at " + sdf.format(new Date()));
	}
	static class Worker extends Thread {	
		String workerName;
		int workTime;
		CountDownLatch countDownLatch;
		
		public Worker(String workerName, int workTime, CountDownLatch countDownLatch) {
			this.countDownLatch = countDownLatch;
			this.workerName = workerName;
			this.workTime = workTime;
		}		
		public void run() {
			try {
				System.out.println("Worker " + workerName + " do work begin at " + sdf.format(new Date()));
				Thread.sleep(workTime);// 工作了
				System.out.println("Worker " + workerName + " do work complete at " + sdf.format(new Date()));
			} catch (InterruptedException e) {
				e.printStackTrace();
			} finally {
				countDownLatch.countDown();//递减锁存器的计数。
			}	
		}
		 
	}
}



cyclicBarrier 同步屏障:
拦截到所有后,释放,所有被拦截的线程才会继续进行


cyclicBarrier和CountDownLatch的区别:
countDownLatch只能用一次,cyclicBarrier的计数器可以使用reset()方法重置。


Semaphore:同事允许几个线程并发操作共享资源  方法: acquire() 和release()

/**
 * <p></p>
 * @author jinxindong 2016年10月31日 下午4:42:07
 * @version V1.0 
 */
//创建一个会实现print queue的类名为PrintQueue
public class PrintQueue {
	
	private final Semaphore semaphore;//声明对象为一个semaphore 信号量
	public PrintQueue(){
		semaphore = new Semaphore(2);
	}
	
	//实现打印功能  模拟打印文档
	public void printJob(Object document){
		try {
	        semaphore.acquire();
	        long duration = (long)(Math.random()*10);
	        System.out.printf("%s: PrintQueue: Printing a Job during %d seconds\n",Thread.currentThread().getName(),duration);
            Thread.sleep(duration);
            
		} catch (Exception e) {
	        // TODO: handle exception
			 e.printStackTrace();
        }finally{
        	semaphore.release();
        }
	}
		
}

Exchanger:两个线程间,的数据交换。如果多余两个取前两个。执行exchange后,返回值是另一个线程的结果。


/**
 * <p></p>
 * @author jinxindong 2016年11月1日 上午10:29:45
 * @version V1.0 
 */
public class ExchangerTest {
	
	private static final Exchanger<String> exc = new Exchanger<String>();
	private static ExecutorService executorService =  Executors.newFixedThreadPool(2);
	
	/**
	 * @author jinxindong 2016年11月1日 上午10:29:45
	 * @param args
	 */
	public static void main(String[] args) {
		//执行线程A
		executorService.execute(new Runnable() {			
			@Override
			public void run() {
				try {
	                String A = "银行流水A";
	                String b = exc.exchange(A); 
	                System.out.println(" b= "+b);
                } catch (Exception e) {
	                e.printStackTrace();
                }				
			}
		});
		
		//执行线程B
		executorService.execute(new Runnable() {			
			@Override
			public void run() {	
				try {
					String B = "银行流水B";
	               String a = exc.exchange(B);
	               System.out.println(" a= "+a);
                } catch (InterruptedException e) {
	                e.printStackTrace();
                }
			}
		});
		
		executorService.shutdown();
	}
	
}


Phaser:
可以代替countDownLatch和CyclicBarrier

1  Phaser pha = new Phaser(2);//countDownLatch(2)
    pha.arrive() // latch.countDown() 减1
    pha.awaitAdvance // latch.await()

2   Phaser pha = new Phaser(2);
     pha.arriveAndAwaitAdvance() // cyc.await()


AQS框架源码分析 AQS就是AbstractQueuedSynchronizer,它是为实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量,事件等)提供的一个框架。AQS继承了AbstractOwnableSynchronizer类,这个类为创建锁和相关同步器提供了基础。... 阅读详情

相关推荐

JUC之AQS框架

AQS是一个框架,一个提供锁或同步器依赖于`FIFO等待队列`所必要的“基础设施”的框架。**Dong Lea**之所以写个抽象类的目的是为了简化我们实现同步器的工作。 提供一个基于FIFO等待队列,可以用于构建锁或者其他同步装置的基础框架。意在能够成为实现大部分同步需求的基础。 AQS默认提供了独占式和共享式两种模式,JDK对应的实现有ReentrantLock和ReentrantReadWriteLock。即除

Lucene/Solr解密 3773

【并发基础】AQS(Abstract Queued Synchronizer)框架的使用和实现原理详解

Java并发包(JUC)中提供了很多并发工具,这其中,很多我们耳熟能详的并发工具,譬如ReentrangLock、Semaphore,它们的实现都用到了一个共同的基类--AbstractQueuedSynchronizer,简称AQS(抽象队列同步器)。AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaph...

小七的博客 2987

本地大模型部署实战:LM Studio与Ollama的易用性与性能深度评测

本文对两款主流本地大模型部署工具LM Studio和Ollama进行了深度评测。LM Studio凭借图形化界面和内置模型库,为新手提供了开箱即用的便捷体验,并支持OpenAI兼容API,易于生态集成。Ollama则以命令行驱动,轻量高效,凭借其原生API和Modelfile自定义能力,在自动化集成和性能方面表现突出。文章从易用性、模型生态、性能及扩展性多维度对比,帮助用户根据自身技术背景和使用场景做出最佳选择。

weixin_29039773的博客 528

【java并发编程】AQS框架

简介 aqs全称抽象队列同步器是AbstractQueuedSynchronize抽象类。 它是一个用来构建锁和同步器的框架,它底层用了CAS技术来保证操作的原子性,同时利用FIFO队列实现线程间的锁竞争,将基础的同步相关抽象细节放在AQS,它能够成为实现大部分同步需求的基础,也是JUC并发包同步的核心基础组件。Lock、ReadWriteLock、CountDowndLatch、CyclicBarrier、Semaphore、ThreadPoolExecutor等都是在AQS的基础上实现的。 A.

sumengnan的博客 1368

自动驾驶预测决策规划八股

预测规划八股个人总结。

dawushixiange的博客 479

避坑指南:ZYNQ MPSOC QSPI固化时MT25QU256闪存的特殊配置

本文针对Xilinx ZYNQ UltraScale+ MPSoC平台,详细解析了使用Vitis工具将BOOT.bin固化至Micron MT25QU256ABA QSPI NOR Flash时的特殊配置与避坑指南。重点阐述了Init文件的真实作用、电压与频率的精确匹配策略,以及针对该闪存型号的初始化序列,帮助工程师解决烧录失败、启动异常等常见问题,确保系统可靠启动。

weixin_29175469的博客 271

Java并发编程AQS详解

AQS,全称AbstractQuenedSynchronizer,可以理解为抽象的队列同步器。所谓抽象就代表着这个类要被继承和复用,实际上AQS这个类也确实是Java实现多线程并发编程的中必不可少的一个基础类,JUC中许多工具类的内部都继承了AQS,而AQS的底层则广泛的应用了CAS的实现。下面我们从源码的角度来深入了解一下AQS这个类。 1.AQS的内部属性 进入AQS类的内部我们先来了解其最重要的三个内部属性: private transient volatile Node head;

qq_40076948的博客 9827

部署资源管理系统chemx

资源管理系统的部署教程

weixin_40784215的博客 822

Java并发编程学习十四:AQS框架

Java并发编程学习

weixin_41402069的博客 1117

Marvell 88E6390x交换芯片:从零构建No-CPU模式网络交换系统

本文详细介绍了如何为Marvell 88E6390x以太网交换芯片构建No-CPU模式网络交换系统。通过解析其核心价值与硬件准备,并手把手指导使用CodeBlocks、IMPGUI和SwitchGUI等软件工具进行配置代码编写、镜像生成与烧录,最终实现交换芯片脱离外部CPU独立工作,适用于成本敏感、空间受限的嵌入式网络设备设计。

plant的博客 483

基于Simulink的占空比调制DTC降低转矩脉动

修改传统SVPWM模块,输入占空比d和有效矢量索引,计算Ton​=d∗Tc​、Toff​=(1−d)∗Tc​,生成对称PWM波形(替代开关表直接输出)。:低速时(n<500rpm)减小dmax​=0.6(避免磁链畸变),高速时(n>2000rpm)增大dmax​=0.8(提升动态响应);kT​/kψ​:转矩/磁链误差增益(需整定,如kT​=0.02/(N⋅m),kψ​=0.1/Wb);(θ为电压矢量与磁链夹角)。② SVM-DTC(占空比计算模块启用,d0​=0.5,kT​=0.02,kψ​=0.1)。

amy_mhd的博客 87

吐血总结:AQS到底是什么?

文章目录1、概述2、基本框架2.1、AQS框架介绍2.2、AQS核心成员变量和方法3、源码分析3.1、CLH队列(FIFO)3.2、独占模式获取资源3.2.1、acquire(int)3.2.1.1、tryAcquire(int arg)3.2.1.2、addWaiter(Node mode)3.2.1.3、acquireQueued(final Node node, int arg)3.2.1.3.1、shouldParkAfterFailedAcquire(p, node)3.2.1.3.2、parkA

u011047968的专栏 7050

哨兵1号回波数据(L0级)包格式解析与成像参数提取

提取哨兵1号数据包的辅助数据、回波数据、定标数据。matlab代码在文末

3126

AQS解读及AQS相关实现类

AQS解读及相关AQS实现类 1. AQS概述 简述:AQS全称AbstractQueuedSynchronizer,即抽象队列同步器。AQS是用来构建锁或者其他同步组件的基础框架,它使用一个整型的volatile变量state来维护同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。AQS为一系列同步器依赖于一个单独的原子变量state的同步器提供了一个非常有用的基础。 AQS的设计是...

java_lg的博客 2129

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IEM模型,地表粗糙度模拟

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

AQS解析以及实现类

AQS概念: Java提供的底层的工具类,用一个 ine 类型变量来表示同步状态(如果大于等于 1 说明有线程已经持有该资源,为 0 表示当前没有线程持有该资源)以及 FIFO 同步队列来实现一个同步器,AQS 是一个抽象类,但是它里面却没有一个抽象的方法,这也更加说明了,AQS不希望被使用者直接的当做功能类来使用,AQS希望作为底层的工具类一样被其他子类所继承,从而子类具体的功能需求 同步器功能...

qq_45239139的博客 1229

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

AQS浅析及其实现类

AQS(AbstractQueuedSynchronizer),抽象队列同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它。 AQS的核心思想是如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态;如果被请求的共享资源被占用,就需要一定的阻塞等待唤醒机制来保证锁分配,这个机制AQS是用CLH队列的变体实现的,即将暂时获取不到锁的线程加入到队列中。 CLH(Craig,Landin,a...

有个疙叫瘩儿的博客 877

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java - AQS-CountDownLatch实现类(二)

CountDownLatch是Java中的一个同步辅助类,用于实现线程间的等待和通知机制。它通过一个计数器来实现,该计数器被初始化为一个正整数,并且只能递减。线程在等待阶段通过调用await()方法等待计数器变为0,而其他线程在完成自己的任务后通过调用countDown()方法来减少计数器的值。当计数器的值变为0时,所有等待的线程都将被唤醒继续执行。

qq_42583549的博客 1157

AQS框架-谈谈对AQS框架的理解

AQS是一个框架,基于它我们可以实现锁和同步器,J.U.C.包中和很多锁和同步器都是基于AQS实现的。 使用AQS的方式通常不是让锁或同步器直接继承AQS类,而是将AQS的子类作为锁或同步器类的一个辅助内部类,锁或同步器的方法调用AQS子类对象的方法完成同步操作。 (图片来自网络) state字段 AQS中最重要的一个字段就是同步状态字段state,锁和同步器的实现都是围绕着这个字段的修改展开的,AQS中也暴露出了一些方法供我们重写以操作这个字段,例如tryAcquire, tryRelease, try

qq_29328443的博客 3173

AQS框架

AQS:抽象队列同步器,定义了一套多线程访问共享资源的同步器框架,提供了SDK层面的锁机制,JUC中的很多类譬如:ReentrantLock/Semaphore/CountDownLatch…等都是基于它。AQS用一个;属性表示锁状态getState(),其中CAS方法是核心。框架内部维护了一个FIFO的等待队列,是用双向链表实现的,我们称之为CLH队列框架也内部也实现了条件变量Condition,用它来实现等待唤醒机制,并且支持多个条件变量。

他叫阿来 1064

AQS理解之六,AQS的其他实现类

AQS理解之六,AQS的其他实现类 1,ThreadPoolExecutor 中的 Worker 类 protected boolean tryAcquire(int unused) { if (compareAndSetState(0, 1)) { setExclusiveOwnerThread(Thread.currentThread()); ...

一个想写小说的程序员 1116

深入理解java并发编程之aqs框架

JUC中的同步器三个主要成员:CountDownLatch、CyclicBarrier和Semaphore,通过它们可以方便的实现很多线程之间的协助功能。CountDownLatch叫倒计数,允许一个或者多个线程等待某些操作完成。跑步比赛,裁判需要等到所有运动员都跑到终点才能计算成绩。模拟并发,需要启动100个线程同时访问某个地址,希望他们能并发执行而不是一个一个执行。

初学者 2187

AQS学习笔记

AQS: Abstract Queued Synchronizer 抽象队列同步器,是java并发编程中一个非常重要的框架,提供了一种高效的锁同步机制,常见的锁实现如Semaphore都是基于AQS实现,本文将基于JDK1.8源码分析AQS实现的思想。AQS是一个强大的同步框架,它通过维护一个同步状态和一个FIFO等待队列,实现了高效的锁和同步机制。可以实现公平锁和非公平锁,可以实现可重入。采用了CAS来保证原子性。

passion 1047

AQS框架学习

对AQS的学习,并不全面,日后学习到了再添加知识点

my4tb 284

11.AQS及相关实现类

AQS AQS是一款抽象的队列式同步器,他定义了一套多线程访问共享资源的同步框架。 当请求得资源空闲那么他将当前请求资源设置为有效的工作线程,并将共享变量设置为锁定状态,如果请求的资源锁定,那么就进入CLH阻塞队列中。 AQS定义两种资源共享方式:Exclusve(独占,只有一个线程执行,如Reentrantlock)和Share(共享,多个线程同时执行,Semaphore/CountD...

骚小孩啊丶 681
上一篇: ConcurrentHashMap总结
下一篇: 线程池相关
Save_Helot
博客等级 码龄10年 0粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值