`

并发库学习笔记五

    博客分类:
  • java
阅读更多

 

并发流程控制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(){}

}

 

 

使用定时器

定时线程池服务

 

ExecutorsScheduledExecutorService的工厂类,你可以创建你需要的线程池

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的时候一定要设定循环的条件

保证在调用notifynotifyAll之前,提供符合线程退出等待的权限

 

 

 

高级并发对象

Lock对象

执行器rnnable对象

并发集合BlockingQueueconcurrentMapConcurrentNavigableMap

原子变量

同步器semaphoresmutexesbarrierslatches

 

 

锁同步法

比较并交换(compareAndsparc)

CAS包括三个操作:内存位置(V)预期原值(A)和新值(B

CAS的并发算法,称为无锁算法

分享到:
评论

相关推荐

    Linux线程开发C++并发库学习笔记

    Linux线程开发C++并发库学习笔记

    java并发库学习笔记

    Java并发库是Java平台中的核心组件,它为多线程编程提供了丰富的工具和接口,使得开发者能够高效、安全地实现并发程序。在Java并发库中,ExecutorService接口和相关的线程池是其核心部分,它们提供了线程管理和任务...

    TBB并发容器 学习笔记

    TBB(Thread Building Blocks)是Intel开发的一个开源C++模板库,专为并行编程设计,旨在帮助开发者充分利用多核处理器的性能。TBB的主要目标是简化并行编程,提供高效、灵活的工具,使程序员可以更容易地创建可扩展...

    JUC并发编程学习笔记(硅谷)

    "JUC并发编程学习笔记(硅谷)"很可能包含了关于Java并发工具集(Java Util Concurrency, JUC)的深入理解和实战经验。JUC是Java标准库提供的一套强大的并发处理工具,它极大地简化了多线程编程,提高了程序的可读性...

    笔记_张孝祥_Java多线程与并发库高级应用

    张孝祥Java多线程与并发库高级应用学习笔记,很经典的学习多线程和并发的资料。张孝祥Java多线程讲义笔记由张孝祥亲自整理,很实用的。

    Go语言学习笔记.pdf 共174页

    Go语言学习笔记.pdf 共174页是一本关于Go语言的详细学习笔记,涵盖了Go语言的基础知识、函数、数组、Maps、Structs、接口、并发、程序结构、标准库等方面的内容。本笔记共分为三大部分:Go语言基础、标准库和扩展库...

    Go 学习笔记 高清

    总结来说,这份学习笔记为学习Go语言的读者提供了一个详尽的路线图,从基础语法、函数、数据结构到并发编程,再到深入理解标准库和高级特性,循序渐进地指导读者掌握Go语言。这些知识点对于想要深入学习Go语言的...

    张孝祥Java多线程与并发库高级应用笔记

    ### 张孝祥Java多线程与并发库高级应用笔记概览 #### 一、Java多线程技术的重要性与挑战 Java线程技术是软件工程领域不可或缺的一部分,尤其在底层编程、Android应用开发以及游戏开发中,其重要性不言而喻。然而,...

    GoLang学习资源_学习笔记和并发编程实战

    "Go语言学习笔记-(详细书签)"是由雨痕编著的,这是一本详实的学习指南,包含了Go语言的基础语法、类型系统、接口、反射、错误处理以及标准库的使用等内容。书签的设置使得你可以快速定位到感兴趣的主题,无论是初学...

    Go语言学习笔记.pdf

    为了深入了解Go语言,学习笔记通常包含语言的基本概念、语法特性、开发环境配置及核心功能的使用方法。 首先,Go语言相较于C++等传统编程语言,有一些显著的特征区别。Go语言为了简化设计,不支持函数重载和操作符...

    VHDL语言学习笔记

    本学习笔记将深入探讨VHDL的基础概念、语法特性以及在实际设计中的应用。 1. **VHDL的基本结构** VHDL的结构主要包括实体(Entity)、架构(Architecture)、包(Package)和配置(Configuration)。实体描述了...

    Go 学习笔记 第四版 pdf

    根据提供的信息,我们可以总结出这份文档是关于Go语言学习笔记的部分内容,主要涵盖了Go语言的基础概念、语法结构、数据类型以及并发模型等关键知识点。以下是对这些知识点的详细解析: ### Go语言概述 Go(也称作...

    Java学习笔记——良葛格

    "Java学习笔记——良葛格"是一份专为初学者设计的教程资料,由良葛格精心编写,旨在帮助读者掌握JDK5.0版本的Java基础知识。JDK(Java Development Kit)是Java开发的核心工具集,包含了编译器、调试器和运行环境等...

    Go学习笔记-第四版-雨痕

    《Go学习笔记-第四版》是由知名编程作者雨痕编写的关于Go语言的教程,旨在帮助读者深入理解和掌握Go语言的各个方面。Go语言,又称Golang,是Google于2009年推出的一种静态类型的、编译型的、并发型且具有垃圾回收...

    Java入门学习笔记

    "Java入门第三季学习笔记"可能涵盖了更多高级话题,如反射、注解、设计模式和Java库的使用。反射允许程序在运行时检查类、接口、字段和方法的信息,提供了更大的灵活性。注解是一种元数据,可以用来提供编译器或运行...

    Go语言学习笔记

    Go语言学习笔记的知识点涵盖广泛,它从基础的语法到高级的并发编程,再到源码的剖析,全面介绍了Go语言的特点和编程技巧。以下是根据所提供的文件内容提取的知识点: 1. Go语言基础:Go是一种静态类型编程语言,...

    多线程学习笔记

    多线程学习笔记 iOS开发中,多线程是一种常见的技术手段,用于优化应用程序的性能,提升用户体验。多线程的核心是让程序能够并发地执行多个任务,合理地利用设备的计算能力,尤其是在拥有多个核心的处理器上。 ...

    良葛格JAVA 学习笔记

    6. **线程与并发**:探讨线程的基本概念、创建与管理,同步机制(如synchronized关键字、wait()、notify()、锁等),以及Java并发库(如ExecutorService、Future、Callable等)的使用。 7. **反射机制**:介绍如何...

Global site tag (gtag.js) - Google Analytics