Count_Down

多线程-AQS-CountDownLatch

南笙酒味 提交于 2019-11-29 23:19:24
介绍: CountDownLatch--发令枪 Java1.5之后引入的Java并发工具类,谈到CountDownLatch需要先介绍一个概念:闭锁/门栓[latch] latch:一种同步方法,可以延迟线程的进度直到线程到达某个终点状态。闭锁的状态是一次性的,它确保在闭锁打开之前所有特定的活动都需要在闭锁打开之后才能完成。 如若掌握了AQS的实现原理,这里的理解将会更加的水到渠成 ==========================分割线========================== 应用场景 A:如同赛跑,必须等待发令枪响后runner才能起跑一样,在CountDownLatch的计数器归零前,所有引用CountDownLatch闭锁的线程都必须阻塞。总结:准备好了才开始 B:如同购物,只有所有商品都确定购买了才好结账,在所有任务执行完[并进行countDown()]直到归零前,当前任务必须阻塞。总结:准备好了才结束 应用A的样例[准备好了才开始]: import java.util.concurrent.CountDownLatch; /** * Created by ysma on 2018/6/7. */ public class Test { public static void main(String[] args) throws

CountDownLatch 学习

牧云@^-^@ 提交于 2019-11-29 06:21:27
countDownLatch也是基于AQS,它是AQS共享功能的一个实现 1 countDownLatch构造 public CountDownLatch(int count) { if (count < 0) throw new IllegalArgumentException("count < 0"); this.sync = new Sync(count); } count最终传递给state ,countDown也是对于state状态的改变 private static final class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 4982264981922014374L; Sync(int count) { setState(count); } int getCount() { return getState(); } protected int tryAcquireShared(int acquires) { return (getState() == 0) ? 1 : -1; } } 2 countDown实现 public void countDown() { sync.releaseShared(1); } public

Java多线程打辅助的三个小伙子

浪尽此生 提交于 2019-11-28 23:08:08
前言 之前学多线程的时候没有学习线程的同步工具类(辅助类)。ps:当时觉得暂时用不上,认为是挺高深的知识点就没去管了.. 在前几天,朋友发了一篇比较好的Semaphore文章过来,然后在浏览博客的时候又发现面试还会考,那还是挺重要的知识点。于是花了点时间去了解一下。 Java为我们提供了 三个同步工具类 : CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量) 这几个工具类其实说白了就是为了能够 更好控制线程之间的通讯问题 ~ 一、CountDownLatch 1.1CountDownLatch简介 A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes. 简单来说:CountDownLatch是一个同步的辅助类, 允许一个或多个线程一直等待 , 直到 其它线程 完成 它们的操作。 它常用的API其实就两个: await() 和 countDown() 使用说明: count初始化CountDownLatch,然后需要等待的线程调用await方法。await方法会一直受阻塞直到count=0。而其它线程完成自己的操作后,调用

190. 定时之后 才允许送请求

泪湿孤枕 提交于 2019-11-27 01:00:42
1. 用途及效果 用途:提醒用户倒计时 2.代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>倒计时10s</title> <script type="text/javascript" src="js/jquery-2.1.4.min.js"></script> </head> <body> 请输入验证码:<input type="text" /> <span id="checkCode"></span> <input type="button" id="btn" value="免费获取验证码" onclick="settime(this)" /> <script type="text/javascript"> var countdown=10;//设置多久后重新发送 function settime(val) { if (countdown == 0) { val.removeAttribute("disabled"); val.value="免费获取验证码"; countdown = 10; // window.location.href='https://www.baidu.com/' } else { val.setAttribute("disabled", true); val.value=

死磕 java同步系列之CountDownLatch源码解析

大兔子大兔子 提交于 2019-11-26 20:29:20
问题 (1)CountDownLatch是什么? (2)CountDownLatch具有哪些特性? (3)CountDownLatch通常运用在什么场景中? (4)CountDownLatch的初始次数是否可以调整? 简介 CountDownLatch,可以翻译为倒计时器,但是似乎不太准确,它的含义是允许一个或多个线程等待其它线程的操作执行完毕后再执行后续的操作。 CountDownLatch的通常用法和Thread.join()有点类似,等待其它线程都完成后再执行主任务。 类结构 CountDownLatch中只包含了Sync一个内部类,它没有公平/非公平模式,所以它算是一个比较简单的同步器了。 这里还要注意一点,CountDownLatch没有实现Serializable接口,所以它不是可序列化的。 源码分析 内部类Sync private static final class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 4982264981922014374L; // 传入初始次数 Sync(int count) { setState(count); } // 获取还剩的次数 int getCount() { return getState();

死磕 java同步系列之ReentrantLock VS synchronized——结果可能跟你想的不一样

放肆的年华 提交于 2019-11-26 20:28:57
问题 (1)ReentrantLock有哪些优点? (2)ReentrantLock有哪些缺点? (3)ReentrantLock是否可以完全替代synchronized? 简介 synchronized是Java原生提供的用于在多线程环境中保证同步的关键字,底层是通过修改对象头中的MarkWord来实现的。 ReentrantLock是Java语言层面提供的用于在多线程环境中保证同步的类,底层是通过原子更新状态变量state来实现的。 既然有了synchronized的关键字来保证同步了,为什么还要实现一个ReentrantLock类呢?它们之间有什么异同呢? ReentrantLock VS synchronized 直接上表格:(手机横屏查看更方便) 功能 ReentrantLock synchronized 可重入 支持 支持 非公平 支持(默认) 支持 加锁/解锁方式 需要手动加锁、解锁,一般使用try..finally..保证锁能够释放 手动加锁,无需刻意解锁 按key锁 不支持,比如按用户id加锁 支持,synchronized加锁时需要传入一个对象 公平锁 支持,new ReentrantLock(true) 不支持 中断 支持,lockInterruptibly() 不支持 尝试加锁 支持,tryLock() 不支持 超时锁 支持,tryLock(timeout,

javaScript倒计时

早过忘川 提交于 2019-11-25 22:34:25
//倒计时 let timeinterval=""; let countDownStart=""; countDown(timeTotal) { timeinterval = setInterval(() => { timeTotal--; countDownStart = timeTotal + "秒"; if (timeTotal <= 0) { clearInterval(this.timeinterval); countDownStart = "倒计时开始"; } }, 1000); } countDown(60); 来源: oschina 链接: https://my.oschina.net/u/4228761/blog/3132101