关于多线程同步的初步教程--Barrier的设计及使用
Barrier是一个多线程编程中经常要用到的同步工具,尤其多用于大数据量的计算过程中的同步。本文以广为流程的Doug Lea的concurrent工具包的Barrier实现为例,进行一点探讨。在Doug Lea的concurrent工具包中,Barrier是一个接口,在concurrent包中提供了两个Barrier的实现:CyclicBarrier和Rendezvous。下面是Barrier接口的定义:
- public interface Barrier {
- /**
- * Return the number of parties that must meet per barrier
- * point. The number of parties is always at least 1.
- **/
- public int parties();
- /**
- * Returns true if the barrier has been compromised
- * by threads leaving the barrier before a synchronization
- * point (normally due to interruption or timeout).
- * Barrier methods in implementation classes throw
- * throw BrokenBarrierException upon detection of breakage.
- * Implementations may also support some means
- * to clear this status.
- **/
- public boolean broken();
- }
Barrier接口中的方法非常简单,parties()返回所有需要在屏障处同步的线程数;broken()返回一个标志,指示释放是否已被破坏。Barrier接口中并没有提供加入屏障的方法,而是在c和Rendezvous的Barrier实现中提供的。你可以会疑问,为什么不在Barrier接口中提供这些方法呢?因为这些实现的差异迥异,以至于很难在这些实现中提炼出一个共用的方法签名。比如,对于CyclicBarrier加入屏障的方法是:barrier(),
- // CyclicBarrier.java
- public int barrier() throws InterruptedException, BrokenBarrierException {
- return doBarrier(false, 0);
- }
- protected synchronized int doBarrier(boolean timed, long msecs)
- throws InterruptedException, TimeoutException, BrokenBarrierException {
- int index = --count_;
- if (broken_) {
- throw new BrokenBarrierException(index);
- }
- else if (Thread.interrupted()) {
- broken_ = true;
- notifyAll();
- throw new InterruptedException();
- }
- else if (index == 0) { // tripped
- count_ = parties_;
- ++resets_;
- notifyAll();
- try {
- if (barrierCommand_ != null)
- barrierCommand_.run();
- return 0;
- }
- catch (RuntimeException ex) {
- broken_ = true;
- return 0;
- }
- }
- else if (timed && msecs <= 0) {
- broken_ = true;
- notifyAll();
- throw new TimeoutException(msecs);
- }
- else { // wait until next reset
- int r = resets_;
- long startTime = (timed)? System.currentTimeMillis() : 0;
- long waitTime = msecs;
- for (;;) {
- try {
- &n
补充:软件开发 , Java ,
- 更多JAVA疑问解答:
- java怎么在线读取ftp服务器上的文件内容
- 关于程序员的职业规划
- HTML和JSP矛盾吗?
- java小程序如何打包?
- java怎么split路径文件名?
- 关于Hibernate实体自身多对一的抓取问题
- 关于apache2+tomcat群集出现的问题
- SSH 导入导出excel 谁有这块的资料吗?
- springmvc 加载一个jsp页面执行多个方法 报404
- 关于用jquery 导入 excel
- java对时间进行循环放到List中
- 一个图片的输入输出程序,第一次调用某方法会中断,第二次调用则正常
- 请上过传智播客的人说一下传智播客怎么样呀!是不是像它说的那样好呀!
- spring的schema怎么配置
- 【菜鸟求助】SSH中怎么从JSP页面往后台传值呢