个人感觉,看书学习还是需要“不求甚解”,因为一旦太过于计较小的得失,就容易钻牛角尖,学习进度也慢。我们完全可以先学一个大概,等到真正用到的时候再把那些细节丰富起来,就更有针对性。

所以,针对java并发核心的东西,我感觉就是一些api的调用,不需要面面俱到,只要知道每个类实现什么,如何调用就行。

1、CountDownLatch:  java.util.concurrent.CountDownLatch  

  CountDownLatch作用:同步功能的辅助类,初始化时传入一个int类型的count值,当count计数不为0时,则当前线程呈wait状态,如果为0,则继续执行。

  需要使用await()和countDown()方法进行:

    调用await()方法,判断count 是否为0,如果不为0则等待(一直等到count值为0时,继续往下执行);await 还有一个api:await(long timeout,TimeUnit unit)。

    调用countDown()方法将count计数减1,当count减到0时,线程继续运行。可使用getCount()方法获取count值。

  对应需要同步的几个线程,需要同时使用同一个CountDownLatch实例对象

  对应countDown()方法的理解就是,相当于一辆长途汽车,只有人坐满了,才会出发(所有线程报团一起继续执行)。

  在某些情况下,涉及到多个模块同步问题时,可以使用多个CountDownLatch实例实现。

2、CyclicBarrier:  java.util.concurrent.CyclicBarrier

  CyclicBarrier作用:与Semaphore、CountDownLatch一样,为同步辅助类。

  CountDownLatch 与 CyclicBarrier 对比:

    CountDownLatch:一个线程活多个线程,等待另外一个线程或者多个线程完成某个事情之后才继续执行。

    CyclicBarrier:多个线程之间互相等待,任何一个线程完成之前,所有线程都必须等待。CyclicBarrier计数是加法操作,加到设定值后,重新归为0,再次循环;CountDownLatch是减法操作,不会循环。

  CyclicBarrier cbRef = new CyclicBarrier( 3 , new Runnable(){/* 线程开始继续执行时操作,如打日志等 */...} );

  就上面这个CyclicBarrier对象,当调用 await() 方法,则count计数加1,当count等于3时,程序继续向下执行,否则程序将呈阻塞状态。

  常用方法:

    await()    每凑齐指定个数线程就报团继续执行

    getParties()    查看报团人数规则

    getNumberWaiting()    查看已有多少线程在等待

    reset()    重置

3、Phaser:java.util.concurrent.Phaser

  Phaser:是对CountDownLatch 与 CyclicBarrier 的全面升级,是一个java并发api的一个重量级类。

  常用api:

    arriveAndAwaitAdvance()    每凑齐指定人数就报团执行一次,同一个线程可以执行多次arriveAndAwaitAdvance(),表示不同阶段的报团

    arriveAndDeregister()    退出当前团,且当前团规则人数减1(报完当前团后,不再报下阶段的团)

    getArrivedParties()    当前团凑足了多少人

    getRegisteredParties()    获取注册的团规定人数

    arrive()    使getArrivedParties()数量加1,即用一个虚拟线程占据一个线程的位置, 此虚拟线程不阻塞

    register()    动态增加一个团的规定人数

    bulkRegister(int parties)    动态的增加规定报团人数,是register()的多次调用版

    forceTermination()    取消报团,线程执行各自代码,不再有Phaser阻塞等待情况    

    getUnarrivedParties()    当前还差多少线程开团,是getArrivedParties()方法的补集

    isTerminated()    判断Phaser对象是否已为销毁状态

    ...

【Java并发核心三】CountDownLatch、CyclicBarrier及Phaser的更多相关文章

  1. java 并发工具类CountDownLatch & CyclicBarrier

    一起在java1.5被引入的并发工具类还有CountDownLatch.CyclicBarrier.Semaphore.ConcurrentHashMap和BlockingQueue,它们都存在于ja ...

  2. Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

    Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...

  3. Java并发编程:CountDownLatch、CyclicBarrier和Semaphore (总结)

    下面对上面说的三个辅助类进行一个总结: 1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同: CountDownLatch一般用于某个线程A等待 ...

  4. 14、Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

    Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...

  5. 【转】Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

    Java并发编程:CountDownLatch.CyclicBarrier和Semaphore   Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在j ...

  6. Java并发工具类 - CountDownLatch

    Java并发工具类 - CountDownLatch 1.简介 CountDownLatch是Java1.5之后引入的Java并发工具类,放在java.util.concurrent包下面 http: ...

  7. Java并发工具类CountDownLatch源码中的例子

    Java并发工具类CountDownLatch源码中的例子 实例一 原文描述 /** * <p><b>Sample usage:</b> Here is a pai ...

  8. 深入浅出Java并发中的CountDownLatch

      1. CountDownLatch 正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中 ...

  9. 带你看看Java的锁(三)-CountDownLatch和CyclicBarrier

    带你看看Java中的锁CountDownLatch和CyclicBarrier 前言 基本介绍 使用和区别 核心源码分析 总结 前言 Java JUC包中的文章已经写了好几篇了,首先我花了5篇文章从源 ...

随机推荐

  1. mysql 案例~ 主从复制转化为级联复制

    一 需求 mysql 主从复制切换成级联复制二 核心思想 1 开启级联复制 2 确定postion点场景 A->B A-C 三 切换步骤  1 先确定好B为级联复制库  2 B添加log_upd ...

  2. aar jar包打包

    使用Android Studio Module的方式编译出aar和jar包: aar包:打aar包时,gradle compile依赖编译进来的包不会被打到aar包中,所以接入aar的应用仍然需要添加 ...

  3. dbms_metadata.get_ddl的用法(DDL)

    dbms_metadata包中的get_ddl函数 --GET_DDL: Return the metadata for a single object as DDL. -- This interfa ...

  4. 数据库的连接使用——使用ADO.NET连接数据库

    一.ADO.NET简介 ADO.NET是由很多类组成的一个类库,这些类库提供了很多对象,用来完成数据的连接.查询.插入.更新和删除等操作.其中主要包括以下对象: 1.Connection对象:用来连接 ...

  5. TortoiseSVN常用配置

    在Windows下推荐使用乌龟(Tortoise)SVN客户端. TortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录. 文件保存在中央版本 ...

  6. (并发编程)进程IPC,生产者消费者模型,守护进程补充

    一.IPC(进程间通信)机制进程之间通信必须找到一种介质,该介质必须满足1.是所有进程共享的2.必须是内存空间附加:帮我们自动处理好锁的问题 a.from multiprocessing import ...

  7. html的结构-厂子型的布局

    上图所示的布局设计是很常见的.这个该怎么做呢? 技术需求:header 要固定住在顶部,不随鼠标滚动而向上移动:左边的div的有一定的宽度,但是要贴浏览器的底部(屏幕顶部):右边的dv要占据右边的全屏 ...

  8. 关于ajax请求,返回json数据格式

    使用servlet测试 后台数据为:返回类型没有设置(方式一) String str = "["+ "{ id:1, pId:0, name:\"可折腾的父节点 ...

  9. 转载:为什么选择Nginx(1.2)《深入理解Nginx》(陶辉)

    原文:https://book.2cto.com/201304/19610.html 为什么选择Nginx?因为它具有以下特点: (1)更快 这表现在两个方面:一方面,在正常情况下,单次请求会得到更快 ...

  10. MariaDB:在Linux下修改编码

    参考网址:http://www.cnblogs.com/vingi/articles/4302330.html: # vi /etc/my.cnf [mysqld] init_connect='SET ...