并发流程控制CountDownLatch
publicvoidtest(){
finalintCOUNT=10;
finalCountDownLatchcountDownLatch=newCountDownLatch(COUNT);
for(inti=0;i<COUNT;i++){
Threadthread=newThread("workThread"+i){
@Override
publicvoidrun(){
//当你启动了一个线程,需要等到他结束
countDownLatch.countDown();
}
};
thread.start();
}
try{
countDownLatch.await();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
publicvoidtest2()throwsInterruptedException{
finalCountDownLatchstartLatch=newCountDownLatch(1);
for(inti=0;i<10;i++){
Threadthread=newThread("workThread"+i){
@Override
publicvoidrun(){
try{
//当你启动很多线程,你需要这些线程在等到通知后才真正可始
startLatch.await();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
};
thread.start();
}
startLatch.countDown();
}
并发流程控制
publicclassperformaceTest{
privateintthreadCount;
privateCyclicBarrierbarrier;
privateintloopCount=10;
publicvoidPerformaceTest(intthreadCount){
this.threadCount=threadCount;
barrier=newCyclicBarrier(threadCount,newRunnable(){
@Override
publicvoidrun(){
collectTestResult();
}
});
for(inti=0;i<threadCount;i++){
Threadthread=newThread("test-thread"+i){
@Override
publicvoidrun(){
for(intj=0;j<loopCount;j++){
doTest();
try{
//使用Barrler来实现并发性能测试的聚合点
barrier.wait();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
};
}
}
//以下是doxx方法
privatevoiddoTest(){}
privatevoidcollectTestResult(){}
}
使用定时器
定时线程池服务
Executors是ScheduledExecutorService的工厂类,你可以创建你需要的线程池
1.5以后就不建议使用java.util.Timer,因为他性能不如ScheduledExecutorService
大规模定时器TimerWheel
timerWheel这个算法最早设计用来实现BSD内核中定时器的,后来被广泛应用到
ACE框架中是BSD算法中的经典
并发的三大定律
Amdahl定律
GeneAmdahl发现在计算机体系架构设计过程中,某个部件的优化对整个架构的优化和改善是有上限的
Gustafson定律
Gustafson假设随着处理器个数的增加,并行与串行的计算总数量也是可以增加的,认为加速系数几乎跟处理器个数成正比
Sun-Ni定律
充分利用存储空间等计算资源,尽量增大问题规模以产生更好/更精确的解线程操作的方法
Start启动一个线程实例,执行run方法
Join一直阻塞直到其他线程退出
Interrupt中断其他线程,线程如果在一个方法中被阻塞,会对interrupt操作做出回应,并在这个方法执行的过程中抛出interrupException,否则线程中的中断状态被设定
Stopsuspendresumedestory这些不应该使用,应该使用interrupt()或者volatile标示告诉线程下一步该作什么
“未捕获异常”处理器,对没有捕获的异常进行处理
Threadthread=newThread(newRunnable(){
@Override
publicvoidrun(){
//操作方法
}
});
thread.setUncaughtExceptionHandler(newUncaughtExceptionHandler(){
publicvoiduncaughtException(Threadt,Throwablee){
//在此对没有捕获的异常进行处理
}
});
thread.start();
死锁
最容易导致死锁的对象monitor,阻塞wait()和notify()也容易产生死锁
饥饿
Starvation是因为一个线程长时间占用锁而导致其他线程一直处于等待状态
活锁
liveLoce线程花费大量资源来处理协调资资源的访问,而没有真正的干活
线程协作
Wait/notify用于一个线程通知另一个线程所需的条件状态已就绪,最常用到线程在循环中休眠,直到获取特定条件的场景
示例代码如下:
publicclassLatch{
privatefinalObjectlock=newObject();
privatevolatilebooleanflag=false;
publicvoidwaitTillChange(){
synchronized(lock){
while(!flag){
try{
lock.wait();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}
publicvoidchange(){
synchronized(lock){
flag=true;
lock.notifyAll();
}
}
}
注:waitnotifynotifyAll必须在synchronized修饰的代码块中执行,否则会抛出
IllegalMonitorStateException异常
在循环条件wait的时候一定要设定循环的条件
保证在调用notify和notifyAll之前,提供符合线程退出等待的权限
高级并发对象
Lock对象
执行器rnnable对象
并发集合BlockingQueueconcurrentMapConcurrentNavigableMap
原子变量
同步器semaphoresmutexesbarrierslatches
锁同步法
比较并交换(compareAndsparc)
CAS包括三个操作:内存位置(V)预期原值(A)和新值(B)
CAS的并发算法,称为无锁算法
分享到:
相关推荐
java并发库学习笔记
TBB 并发容器 concurrent_queue concurrent_vector concurrent_hash_map TBB 并发容器 concurrent_queue concurrent_vector concurrent_hash_map TBB 并发容器 concurrent_queue concurrent_vector concurrent_hash_...
NULL 博文链接:https://itway.iteye.com/blog/1539359
张孝祥Java多线程与并发库高级应用学习笔记,很经典的学习多线程和并发的资料。张孝祥Java多线程讲义笔记由张孝祥亲自整理,很实用的。
Java秒杀系统方案优化高性能高并发学习实战源代码以及笔记..zip 章节笔记 第1章-课程介绍及项目框架搭建 知识点 使用spring boot 搭建项目基础框架 使用Thymeleaf做页面展示,封装Result统一结果 集成 mybatis + ...
CLR:公共语言运行库。 15.什么是装箱和拆箱? 答:从值类型接口转换到引用类型装箱。从引用类型转换到值类型拆箱。 16.什么是受管制的代码? 答:unsafe:非托管代码。不经过CLR运行。 17.什么是强类型系统? ...
广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。 完善的 SPI 扩展点:Sentinel...
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems公司于1995年5月正式发布。它的设计目标是“一次编写,到处运行(Write Once, Run Anywhere)”,这意味着开发者可以使用Java编写应用程序,并在支持...
协程库state threads library(以下简称st)是一个基于setjmp/longjmp实现的C语言版用户线程库或协程库(user level ...srs流媒体服务器就是基于协程库开发的,这就是它实现高并发的原因。 希望能对初学者有所帮助。
c#学习笔记(1) 51099在线学习网发布 文章来源:网络收集 发布时间:2006-05-25 字体: [大 中 小] 51099在线学习网 http://www.51099.com 1, 结构(struct) 与 类(class) [attributes] [modifiers] struct ...
go语言学习笔记 该仓库记录的go语言学习笔记 一go语言基础 go语言特点: 运行效率高,且简单易学 跨平台 丰富的标准库 可以直接使用c代码 语言规范支持并发 本节主要内容如下 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9...
Guava学习笔记笔记的大部分中文翻译内容来源于以下译者: 沉义扬,罗立树,何一昕,武祖校对:方腾飞感谢给我们带来的这一系列好文章。引言Guava工程包含了若干被Google的Java项目广泛依赖的核心库,例如:集合...
本仓库是笔者在学习过程中的知识总结,内容以Java后端的知识总结为主。 【个人博客】 Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ 算法 操作系统 网络 数据库 Java JavaWeb 分布式 设计模式 算法 :pencil: 操作系统 :laptop: 网络 :...
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems公司于1995年5月正式发布。它的设计目标是“一次编写,到处运行(Write Once, Run Anywhere)”,这意味着开发者可以使用Java编写应用程序,并在支持...
主要内容包括数据库建模、关系模型和关系运算、数据库语言SQL(包括最新标准 SQL2和SQL3)及其系统环境、关系数据库设计理论及数据库设计、面向对象的对象定义语言和对象查询语言、以及查询优化和并发控制。...
Java 的学习笔记和整理的知识点,包含Java语言基础、Java服务端方向的框架、设计模式、计算机网络、算法、Java 虚拟机和数据库等多个方面的内容。想了解前端的内容参考,Android相关的内容参考。 目录结构 语言基础...
关于并发与并行 关于协程 关于goroutine 使用 单个 多个 池 同步 介绍 互斥锁 读写锁 原子操作 执行 可增长的栈 goroutine调度 GOMAXPROCS 回收 sync.WaitGroup sync.Once sync.Map 泄露 ...
高级java笔试题 awesome-learning Github repository ...记录各种学习笔记(算法、Java、数据库、并发......) Design patterns implemented 进阶/博客/笔记 很全面的学习笔记,偏向 Android 和 Java To
:books:学习是一个不断模仿,练习,创新,超越的过程,一起努力吧〜 本仓库正在不断更新,敬请期待 :glowing_star: 〜 :high_voltage: | :sparkles: | :bookmark_tabs:计算机基础 数据结构 算法 :fire: ...