java并发的艺术-读书笔记-第八章常用的并发工具类

jdk中提供了几个非常有用的工具类,分别是CountDownLatch,CyclicBarrier和semaphore exchanger

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

public class CountDownLatchTest{

static CountDownLatch c = new CountDownLatch(2);

public static void main(String[] args){

new Thread(new Runnable(){

System.out.println(1);

c.countDown();

System.out.println(2);

c.countDown();

}).start();

c.await();

System.out.println("3");

}

}

CountDownLatch的构造函数接收一个int 型的参数作为计数器,当你等待n个点就传入n,当我们调用CountDownLatch的countdown方法时,n就会减一,CountDownLatch的await方法一直阻塞,直到n变成0,这里的n 指的是n个线程,或者是n个点,在用多线程时,只需要把countdownlatch传入即可。

同步屏障CyclicBarrier

他要做的事情是让一组线程达到一个屏障时被阻塞,直到最后一个线程达到一个屏障时,屏蔽才会开门,所有被屏蔽拦截的线程才能继续运行

应用伪代码:

public class CyclicBarrierTest{

static CyclicBarrier c=new  CyclicBarrier(2);

public static void main(String[] args){

new Thread(

new Runnable(){

@overide

public void runnable(){

c.await();

System.out.println(1);

}

}

).start();

c.await();

System.out.printlN(2);

}

}

由于cpu分配时间片的不确定性,因此输出的结果1,2 也可能是2,1

CycilcBarrier 提供了一个更高级的构造函数(int parties , Runnable runnable)

runnable 表示在达到了临界点后优先执行runnable。

CycilcBarrier和coutdownlatch的区别

countdownlatch只能使用一次,cycilcBarrier可以使用多次,可以使用reset方法重置,所以cyclicbarrier能适用于更复杂的业务场景。例如计算错误,可以重置,并重新计算结果。

cyclicBarrier方法补充:getNumberWaiting 获得阻塞线程数量

isbroken 阻塞线程时否被中断

控制线程并发数 semaphore(信号量)

semaphore信号量用来控制同时访问特定资源的线程数量。它通过协调各个线程,以保证合理的使用公共资源

应用场景:可以用作流量控制,特别是公共资源的有限场景比如数据库连接,

public Class SemaphoreTest{

private static final int THREAD_COUNT=30;

private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(THREAD_COUNT);

private  static Semaphore s = new Semaphore(20);

public static void main(String[] args){

threadPool.executor(new Runnable(){

public void runnable(){

s.acquire():

System.out.println("使用中。。。。。");

s.release();

}

}):

}

}

线程间交换数据exchanger

Exchanger 是一个线程间协作的工具类,exchanger用于进行线程间的数据交换,他提供一个交换点,在这个同步点,两个线程可以交换彼此间的数据。这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange方法,它一直会等待第二个线程执行exchange方法,当两个线程执行到交换点时,两个线程将交换数据,将本线程产生的数据传递给对方

应用场景,主要用于两个线程间对产生的数据进行校验

时间: 2024-10-26 02:24:16

java并发的艺术-读书笔记-第八章常用的并发工具类的相关文章

JAVA并发编程实战 读书笔记(二)对象的共享

<java并发编程实战>读书摘要 birdhack 2015年1月2日 对象的共享 JAVA并发编程实战读书笔记 我们已经知道了同步代码块和同步方法可以确保以原子的方式执行操作,但一种常见的误解是,认为关键之synchronized只能用于实现原子性或者确定临界区.同步还有另一个重要的方面:内存可见性. 1.可见性 为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制. 在没有同步的情况下,编译器.处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整.在缺乏足够同步的多线程程

Unix编程艺术读书笔记(一)

 Unix编程艺术读书笔记(一)这本书是一位面试官告诉我的,很感谢他的指点,关于面试的详细过程,我想以后再写,当然我也意识到自己的不足,一方面是面试的技巧,还有一方面就是学习的方法.阅读这本书很享受,加上之前的积累,一些疑惑,还有一些基础的不足,在这本书里找到了归宿. 下面,一起来享受这本书的精华吧 Unix诞生与1969年,那时候我们还在闹文革吧,可一个可以改变21世纪甚至更远的未来的操作系统问世,至少现在的Linux是基于Unix的设计哲学.Unix是唯一一个在不同种类的计算机,众多厂商

Javascript DOM 编程艺术读书笔记16/04/01

愚人节快乐 开始用webstorm了,随着学习深入,代码越来越长,因为不借助ide还真是挺难的 今天发现了一个严重的误区,text和textNode是完全不同的两个概念,之前没有特别注意,写代码很容易跳过createTextNode直接用parentNode.appendChild(text) 单独拎出来晒一晒,以后引以为戒 Javascript DOM 编程艺术读书笔记16/04/01

&lt;Getting Things Done&gt; 搞定I 无压工作的艺术 读书笔记

最近感觉时间管理做的特别差,上周末好多事乱成一锅粥.于是借来同事的书来看,发现真的写的特别好! 在这里挑重点和自己的心得总结一下. 第1章 问题: 1. 现代社会的事情不断涌现,已经不是把事情做个列表,先做重要紧急的,这样简单的做法就能应付得了. 2. 很多要去做的事情被我们存在了大脑里,只是记得需要去做,增加心理压力,却没时间真正去实施.这样的缓存其实是造成我们低效率的一个原因. 目标:做每件事都处于一种忘我的境界,心如止水,享受其中.(我们都曾经无意识地达到过这种最高境界,但是却不能控制自己

Java核心技术 卷1 读书笔记 (3 Java基本程序设计结构)

3.3 数据类型 Java是强类型语言,必须为每一个变量声明一种类型. 3.3.1 整型 Java 提供四种整型 int 4字节 short 2字节 long 8字节 byte 1字节 长整型(long)数值有一个后缀L(例如40000000000L),十六进制数值有一个前缀0x(例如0xCAFE),八进制数值有一个前缀0(例如010). 3.3.2 浮点型 Java提供两种浮点类型 float 4字节 double 8字节 float类型的数值有一个后缀F(例如3.42F),没有后缀F的浮点数

JavaScript DOM编程艺术 读书笔记

3 DOM DOM分别指document,object和model. DOM中包含的节点主要分为三种:元素节点.文本节点和属性节点.DOM的原子是元素节点,标签的名字就是元素的名字,元素可以包含其他的元素.没有被包含在其他元素里的唯一元素是<html>元素,它是树节点的根元素:在XHTML文档里,文本节点总是被包含在元素节点的内部.但并非所有的元素节点都包含有文本节点:属性节点用来对元素做出更具体地描述. 有3种DOM方法可获取元素节点,分别是通过元素ID.通过标签名字和通过类名字来获取. 1

【Unity 3D】学习笔记二十八:unity工具类

unity为开发者提供了很多方便开发的工具,他们都是由系统封装的一些功能和方法.比如说:实现时间的time类,获取随机数的Random.Range( )方法等等. 时间类 time类,主要用来获取当前的系统时间. using UnityEngine; using System.Collections; public class Script_04_13 : MonoBehaviour { void OnGUI() { GUILayout.Label("当前游戏时间:" + Time.t

Java基础——集合(三)——泛型、增强for、工具类

         接上篇,<Java基础--集合(二)--迭代器.Map集合> 六.泛型 (1)定义: 泛型是一种把明确类型的工作放在了创建对象或者调用方法时候才去明确的特殊的类型. (2)格式: <数据类型> ArrayList<String> aList=new ArrayList<String>(); <String> 即表示的是泛型 (3)好处:(掌握) A:解决了黄色警告线问题 B:把运行期间的转换异常给提前到了编译期间 C:优化了程序

Java常用正则表达式验证工具类RegexUtils.java

原文:Java常用正则表达式验证工具类RegexUtils.java 源代码下载地址:http://www.zuidaima.com/share/1550463379442688.htm Java 表单注册常用正则表达式验证工具类,常用正则表达式大集合. 1. 电话号码 2. 邮编 3. QQ 4. E-mail 5. 手机号码 6. URL 7. 是否为数字 8. 是否为中文 9. 身份证 10. 域名 11. IP .... 常用验证应有尽有! 这的确是您从事 web 开发,服务器端表单验证