博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CountDownLatch使用及实现原理
阅读量:6651 次
发布时间:2019-06-25

本文共 2993 字,大约阅读时间需要 9 分钟。

hot3.png

CountDownLatch是Java提供的线程递减锁,为开发人员封装出来针对特殊场景使用的工具类,主要用在某一个动作的执行以来其他动作对应线程的完成。

使用步骤:

1.拿到一个CountDownLatch实例,初始化大小为依赖的动作线程数

2.将CountDownLatch实例传递给依赖线程

3.在依赖线程执行完对应的动作后调用CountDownLatch.countDown方法

4.在主线程中调用CountDownLatch.await方法

package com.jv.parallel.feature;import java.util.concurrent.CountDownLatch;/* * 线程递减锁,用来控制某一个动作的执行依赖其他动作线程的完成 *  * 例如:开始钓鱼之前先要做主线、拌饵料、打窝子 */public class TestCountDownLatch {	public static void main(String[] args) throws InterruptedException {		// 1.声明一个线程递减锁		// 因为在钓鱼		CountDownLatch cdl = new CountDownLatch(3);		new Thread(new TieLine(cdl)).start();		new Thread(new MixedFood(cdl)).start();		new Thread(new Feed(cdl)).start();		cdl.await();		System.out.println("开始愉快的钓鱼了");	}		/*	 * 制作钓鱼的主线	 */	static class TieLine implements Runnable{		CountDownLatch cdl;		public TieLine(CountDownLatch cdl) {			this.cdl = cdl;		}		@Override		public void run() {			System.out.println("制作4.5的主线");			cdl.countDown();		}			}		/*	 * 拌饵料	 */	static class MixedFood implements Runnable{		CountDownLatch cdl;		public MixedFood(CountDownLatch cdl) {			this.cdl = cdl;		}		@Override		public void run() {			System.out.println("拌饵料");			cdl.countDown();		}	}		/*	 * 做窝子	 */	static class Feed implements Runnable{		CountDownLatch cdl;		public Feed(CountDownLatch cdl) {			this.cdl = cdl;		}		@Override		public void run() {			System.out.println("打窝子");			cdl.countDown();		}	}}

CountDownLatch核心是使用了一个继承AbstractQueuedSynchronizer的同步器,这种设计模式称之为模板方法(在抽象类中定义算法的骨架,由子类实现骨架中具体的方法),模板方法设计模式可以参阅

CountDownLatch.await方法

public void await() throws InterruptedException {        sync.acquireSharedInterruptibly(1);    }

同步器的acquireSharedInterruptibly方法其实是CountDownLatch.Syn父类AbstractQueuedSynchronizer的,它就是一个算法骨架

public final void acquireSharedInterruptibly(int arg)            throws InterruptedException {        if (Thread.interrupted())            throw new InterruptedException();        if (tryAcquireShared(arg) < 0)            doAcquireSharedInterruptibly(arg);    }

acquireSharedInterruptibly的核心就是调用子类实现的tryAcquireShared

再看CountDownLatch.Syn中实现的抽象方法tryAcquireShared,tryReleaseShared

protected int tryAcquireShared(int acquires) {            return (getState() == 0) ? 1 : -1;        }        protected boolean tryReleaseShared(int releases) {            // Decrement count; signal when transition to zero            for (;;) {                int c = getState();                if (c == 0)                    return false;                int nextc = c-1;                if (compareAndSetState(c, nextc))                    return nextc == 0;            }        }

CountDownLatch.countDown方法

public void countDown() {        sync.releaseShared(1);    }

同步器的releaseShared方法其实是CountDownLatch.Syn父类AbstractQueuedSynchronizer的,它也是一个算法骨架

public final boolean releaseShared(int arg) {        if (tryReleaseShared(arg)) {            doReleaseShared();            return true;        }        return false;    }

releaseShared的核心就是调用子类实现的tryReleaseShared

转载于:https://my.oschina.net/u/3049601/blog/1808526

你可能感兴趣的文章
V8提升异步性能:JavaScript一大痛点得以解决
查看>>
Confluent平台5.0支持LDAP授权及用于IoT集成的MQTT代理
查看>>
比其他行业晚了十年的工业软件,转型的核心和动力是什么?
查看>>
MAC Androidstudio打开移动硬盘项目
查看>>
Istio:一个用于微服务间通信的服务网格开源项目
查看>>
.NET Core 2.1预览版首次引入Global Tools
查看>>
我是一个码农
查看>>
Golang redis 操作初体验
查看>>
Fastreport.Net用户手册(十):打印Bands
查看>>
HTTP 响应头与状态码
查看>>
javascript常用方法函数收集(一)
查看>>
docker网络方案简介
查看>>
window.scrollTo()函数注意点(js)
查看>>
Mac:更好地工作 - 应用内快捷键
查看>>
原型链是什么?关于原型链中constructor、prototype及__proto__之间关系的认识
查看>>
Android小技巧:自动初始化Library
查看>>
[jQuery]jQuery DataTables插件自定义Ajax分页实现
查看>>
CSS实现3D切换效果
查看>>
PyTips 0x17-Python 中的枚举类型
查看>>
Android与Node.js的http数据交互
查看>>