java线程并发工具类CyclicBarrier、CountDownLatch及Semaphore

1、CyclicBarrier   (原文连接:http://www.studyshare.cn/blog-front/blog/index )java

一、定义sql

CyclicBarrier是线程并发工具类之一,俗称栅栏。当一组线程所有执行完后,到达栅栏屏障,就放开屏障,继续日后执行。举个简单例子:几个家庭约数据库

定一个地点集合去郊游,只有当全部家庭都到达后再商量下一步计划,只要有一个没到,先到达的家庭都必须等待。多线程

二、示例demo并发

实现:用5个子线程去执行任务,当任务执行完成后,交出本身的执行结果,再被统一释放(开放栅栏)去作本身的事情,而以前5个子线程交出的结果函数

被另一个线程使用作其余工做。高并发

代码以下:工具

三、执行结果:测试

 

2、CountDownLatchui

一、定义

CountDownLatch是线程并发工具类,该类具备一个计数器,计数器具备一个初始化的值,当主线程调用latch.await()方法则进行阻塞,调用

latch.countDown()方法时计数器值减一,一直等到计数器的值减为0的时候,原来阻塞的方法继续往下执行。代码以下:

 

(1)、定义两个线程,线程一调用一次countDown(),线程二调用两次countDown()

(2)、主线程代码以下

(3)运行结果

二、使用场景

(1)、使用CountDownLatch编写高并发测试程序,可使用CountDownLatch初始化100或者更多线程,当全部线程初始化完毕后

一块儿去调用须要测试的业务模块代码,以此来模拟实际场景的高并发访问,测试业务代码对高并发的支持极限。

(2)、某些系统启动以前须要作不少初始化工做,只有当初始化工做线程中的全部代码执行完毕后,才继续执行主线程代码,此时

使用CountDownLatch来实现。

三、实现原理

CountDownLatch是基于AQS(AbstractQueuedSynchronizer (抽象队列同步器))实现的,关于AQS在另一篇文章有详细讲解,包

括对源码进行了深刻分析,请参考:http://www.studyshare.cn/blog-front//blog/details/1131/0

3、Semaphore

一、定义:

Semaphore:即信号量,它管理着一组虚拟的许可,许可的初始数量可经过构造函数指定,在执行操做时先获取许可(只要还有剩余的

许可),并在使用后释放许可,若是没有许可,则acquire方法会阻塞直到有许可。它提供的release()方法将返回一个许可给信号量。

 二、关键方法

aquire():获取一个虚拟许可,若是Semaphore中还有剩余许可,则返回,不然此方法会阻塞,直到Semaphore中有许可为止。

release():释放一个虚拟许可回Semaphore中

三、使用场景

使用Semaphore实现一个数据库链接池。demo源码下载

(1)首先定义一个数据库链接实现类,实现java.sql.Connection接口,以下

说明:java.sql.Connection实现方法不少,已省略。可下载demo源码查看

(2)使用Semaphore实现数据库链接池,代码以下:

(3)、运行验证结果分析

原创文章,转载请注明来源:http://www.studyshare.cn/blog-front/blog/details/1157/0

更多技术文章:http://www.studyshare.cn/blog-front//blog/index

相关文章
相关标签/搜索