J.U.C AQS(abstractqueuedssynchronizer--同步器)
J.U.C AQS(abstractqueuedssynchronizer--同步器)
同步器是用来构建锁和其他同步组件的基础框架,它的实现主要依赖一个int成员变量来表示同步状态以及通过一个FIFO队列构成等待队列。
CountDownLatch
用来控制一个线程等待多个线程。维护了一个计数器cnt,每次调用countDown()方法,会是cnt的计数值减1,减到0 的时候,那些因为调用await()而等待的线程被唤醒。
package ConcurrentExemple;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownLatchExemple {
public static void main (String[]args)throws InterruptedException{
final int totalThread=10;
CountDownLatch countDownLatch=new CountDownLatch(totalThread);
ExecutorService executorService= Executors.newCachedThreadPool();
for(int i=0;i<10;i++){
executorService.execute(()->{
System.out.println(Thread.currentThread().getName()+"开始运行");
try{
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"已经运行完");
countDownLatch.countDown();
});
}
countDownLatch.await();
System.out.println("休眠线程唤醒");
executorService.shutdown();
}
}
CyclicBarrier
用来控制多个线程相互等待,等到所有的线程都到达时,这些线程才会继续执行。
它同CountDownLatch一样维护一个计数器cnt,每个线程调用一次await(),cnt减一,当cnt为0 的时候,所有的线程都到达,这时这些线程继续执行。CyclicBarrier 和 CountdownLatch 的一个区别是,CyclicBarrier 的计数器通过调用 reset() 方法可以循环使用,所以它才叫做循环屏障。
package ConcurrentExemple;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CyclicBarrierExemple {
public static void main(String[]args){
final int totalThread=10;
CyclicBarrier cyclicBarrier=new CyclicBarrier(totalThread);
ExecutorService executorService= Executors.newCachedThreadPool();
for(int i=0;i<totalThread;i++){
executorService.execute(()->{
System.out.println(Thread.currentThread().getName()+"begin");
try{
cyclicBarrier.await();
}catch (InterruptedException| BrokenBarrierException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"end");
});
}
executorService.shutdown();
}
}
Semaphore
信号量Semaphore 类似于操作系统中的信号量,可以控制对互斥资源的访问线程数。
以下代码模拟了对某个服务的并发请求,每次只能有 3 个客户端同时访问,请求总数为 10。
package ConcurrentExemple;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class SemaphoreExemple {
public static void main(String[]args){
int customer=3;
int totalThread=10;
Semaphore semaphore=new Semaphore(customer);
ExecutorService executorService= Executors.newCachedThreadPool();
for(int i=0;i<totalThread;i++){
executorService.execute(()->{
try {
semaphore.acquire();
System.out.println(semaphore.availablePermits()+" ");
Thread.sleep(3000);
}catch (InterruptedException e){
e.printStackTrace();
}finally {
semaphore.release();
}
});
}
executorService.shutdown();
}
}
J.U.C AQS(abstractqueuedssynchronizer--同步器)的更多相关文章
- 高并发第十单:J.U.C AQS(AbstractQueuedSynchronizer) 组件:CountDownLatch. CyclicBarrier .Semaphore
这里有一篇介绍AQS的文章 非常好: Java并发之AQS详解 AQS全名:AbstractQueuedSynchronizer,是并发容器J.U.C(java.lang.concurrent)下lo ...
- Java并发框架——AQS之如何使用AQS构建同步器
AQS的设计思想是通过继承的方式提供一个模板让大家可以很容易根据不同场景实现一个富有个性化的同步器.同步器的核心是要管理一个共享状态,通过对状态的控制即可以实现不同的锁机制.AQS的设计必须考虑把复杂 ...
- 高并发第十一弹:J.U.C -AQS(AbstractQueuedSynchronizer) 组件:Lock,ReentrantLock,ReentrantReadWriteLock,StampedLock
既然说到J.U.C 的AQS(AbstractQueuedSynchronizer) 不说 Lock 是不可能的.不过实话来说,一般 JKD8 以后我一般都不用Lock了.毕竟sychronize ...
- Java并发框架——AQS之怎样使用AQS构建同步器
AQS的设计思想是通过继承的方式提供一个模板让大家能够非常easy依据不同场景实现一个富有个性化的同步器.同步器的核心是要管理一个共享状态,通过对状态的控制即能够实现不同的锁机制. AQS的设计必须考 ...
- Java并发编程,深度探索J.U.C - AQS
java.util.concurrent(J.U.C)大大提高了并发性能,AQS 被认为是 J.U.C 的核心. CountdownLatch 用来控制一个线程等待多个线程. 维护了一个计数器 cnt ...
- AQS(队列同步器)
目录导引: 一.简介 二.源码解析(JDK8) 三.运用示例 一.简介 1.volatile volatile修饰的共享变量可以保证可见性和有序性(禁止指令重排序). 2.CAS: CAS的原理很简单 ...
- 源码级深挖AQS队列同步器
我们知道,在java中提供了两类锁的实现,一种是在jvm层级上实现的synchrinized隐式锁,另一类是jdk在代码层级实现的,juc包下的Lock显示锁,而提到Lock就不得不提一下它的核心队列 ...
- Java并发之AQS同步器学习
AQS队列同步器学习 在学习并发的时候,我们一定会接触到 JUC 当中的工具,JUC 当中为我们准备了很多在并发中需要用到的东西,但是它们都是基于AQS(AbstractQueuedSynchroni ...
- Java 显示锁 之 队列同步器AQS(六)
1.简述 锁时用来控制多个线程访问共享资源的方式,一般情况下,一个锁能够防止多个线程同时访问共享资源.但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁. 在Java 5.0之前,在协调对共享对 ...
随机推荐
- 关于多账套API的设计
帐套在财务核算中是记载一个独立核算的经济实体的所有往来信息的一整套记录表和统计分析报表.不同的帐套之间的关系是相对独立的,对其中的任何一个帐套中的数据进行建立.删除或修改都不会影响其他帐套.在ERP中 ...
- javascript——正则表达式(RegExp、String)(未完工)
在 javascript 中,正则表达式由两部分组成:正则表达式的匹配模式文本:匹配模式文本的修饰符: 修饰符: 修饰符 说明 i 忽略大小写 g 执行全局匹配 m 执行多行匹配 匹配模式文本包括以下 ...
- 控制器对应view生命周期
一.控制器view创建的六种方式 1.有没有同名xib创建2.通过 storyboard 创建3.有指定xib情况下创建4.有同名xib情况5.有同名去掉controll的情况6.loadveiw ...
- Git实用技巧
1.关于版本控制系统 (1)本地版本控制系统 (2)集中化的版本控制系统 (3)分布式版本控制系统 2.Git的三种状态 对于任何一个文件,在 Git 内都只有三种状态: 已提交(committed) ...
- AudioTrack
AudioTrack 在Java应用中,管理和播放一个单一的语音资源 The AudioTrack class manages and plays a single audio resource fo ...
- 使用HttpWebRequest POST 文件,带参数
public string HttpUploadFile(string url, string file, string paramName, string contentType, NameValu ...
- 免安装Oracle客户端使用PL/SQL连接Oracle
只需要在Oracle下载一个叫Instant Client Package的软件就可以了,这个软件不需要安装,只要解压就可以用了,很方便,就算重装了系统还是可以用的. 下载地址:http://www. ...
- CentOS 7 下设置DNS
在CentOS 7下,手工设置 /etc/resolv.conf 里的DNS,过了一会,发现被系统重新覆盖或者清除了.和CentOS 6下的设置DNS方法不同,有几种方式: 1.使用全新的命令行工具 ...
- 高性能MySQL笔记-第5章Indexing for High Performance-001B-Tree indexes(B+Tree)
一. 1.什么是B-Tree indexes? The general idea of a B-Tree is that all the values are stored in order, and ...
- 两个进程之间的通讯——pipe 管道
在实际工作中,已经编辑好了NIPT_analysis的软件,该软件一般的输入文件是sam文件,但是为了集成进入测序仪器,需要直接从比对软件的标准输出中读取sam文件,省去了比对软件和NIPT_anal ...