Count_Down

面试刷题19:并发工具包有哪些工具?

我们两清 提交于 2020-04-05 17:46:05
<br />java.util.concurrent包提供了大量的并发工具。<br /> <br /> <br />大家好,我是李福春,今天的题目是:<br /> <br />java提供的并发工具有哪些?<br /> <br />答:java.util.concurrent工具包中提供的工具分4大类。<br /> <br />一, 同步工具,CountDownLatch, CyclicBarrier , Semaphore ;<br />二, 并发安全容器, ConcurrentHashMap,ConcurrentSkipListMap,<br />CopyOnWriteArrayList,CopyOnWriteArraySet;<br />三,并发安全队列,主要用在线程池上,ArrayBlockingQueue,SynchronousQueue,PriorityBlockingQueue;<br />四,并发线程池executor框架;<br /> <br /> <br /> 同步工具 semaphore <br />信号量,设置并发访问的线程数量。<br /> <br />一般要结对使用: try{s.acquire();}finally{s.release()}<br /> package org.example.mianshi.synctool; import java

计数器:CountDownLatch,CountDownLatch,CyclicBarrier

 ̄綄美尐妖づ 提交于 2020-03-25 20:59:56
3 月,跳不动了?>>> // 创建2个线程的线程池 Executor executor = Executors.newFixedThreadPool(2); while(存在未对账订单){ // 计数器初始化为2 CountDownLatch latch = new CountDownLatch(2); // 查询未对账订单 executor.execute(()->{ pos = getPOrders(); latch.countDown(); }); // 查询派送单 executor.execute(()->{ dos = getDOrders(); latch.countDown(); }); // 等待两个查询操作结束 latch.await(); // 执⾏对账操作 diff = check(pos, dos); // 差异写⼊差异库 save(diff); } 计数器 CountDownLatch: 一个线程等待多个线程。 //定义一个初始值为2的计数器 CountDownLatch latch = new CountDownLatch(2); //计数器-1 latch.countDown(); //线程等待,等待至计数结束。 latch.await(); CyclicBarrier:多个线程相互等待,等待结束执行回调。 //创建一个初始值为2得计数器

JUC回顾

时光怂恿深爱的人放手 提交于 2020-03-17 20:16:15
某厂面试归来,发现自己落伍了!>>> 一.JUC是什么? java.util.concurrent在并发编程中使用的工具类。 前景回顾 1.进程\线程是什么? 进程\线程都是操作系统而不是JVM的。 进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。 进程是一个独立运行的程序。 线程:通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。 电脑上运行的QQ就是一个进程,而使用QQ能支持视频、聊天、发文件。每一个功能都是一个独立的线程。 2.线程的状态? NEW (新建) RUNNABLE (准备就绪) BLOCKED (阻塞) WAITING (不见不散) TIMED_WAITING (过时不候) TERMINATED (终结) 3.wait/sleep的区别? 功能都是暂停当前线程。区别是 wait是睡了放开手里的锁,sleep是带着锁睡。 4.什么是并发?什么是并行? 并发

【从0到1学算法】递归

試著忘記壹切 提交于 2020-03-12 20:43:35
今天我们将学习一种优雅的问题解决方式--递归。 对于它,通常有3个阵营:恨它的、爱它的以及恨了几年后又爱上它。你属于哪一个? 1、递归 递归就是函数自己调用自己,但写递归很容易出错而导致死循环。循环和递归是可以相互转换,下面从一个简单例子学习递归。现在需要编写一个倒计时函数。效果如下: 3 2 1 循环方式代码: def countdown(i): # 从i开始, 到0结束(不包括0),每次循环-1 for j in range(i, 0, -1): print(j)</pre> 如何用递归方式写呢?一开始你可能会这样写: def countdown(i) print(i) # 变量-1,调用自己 countdown(i-1)</pre> 运行上面的代码,你会发现:这个函数运行起来没完没了! 如何正确编写递归? 编写递归,必须得告诉它如何停止。正因如此,递归函数都有这两部分: 基线条件 和 递归条件 。递归条件指什么情况下调用自己,而基线条件指什么情况下停止调用自己。我们只需要倒计时到1,所以这里它的基线条件便是:i<=1,其他情况都需要调用自己。 def countdown(i) print(i) if i <= 1:#<-----------基线条件 return else:#<----------- 递归条件条件 countdown(i-1)</pre>

限流后,你可以通过指数退避来重试

若如初见. 提交于 2020-03-04 22:20:47
一、背景 本文同步发表于 Prodesire 公众号 ,和 Prodesire 博客 。 最近做云服务 API 测试项目的过程中,发现某些时候会大批量调用 API,从而导致限流的报错。在遇到这种报错时,传统的重试策略是每隔一段时间重试一次。但由于是固定的时间重试一次,重试时又会有大量的请求在同一时刻涌入,会不断地造成限流。 这让我回想起两年前在查阅 Celery Task 文档 的时候发现可以为任务设置 retry_backoff 的经历,它让任务在失败时以 指数退避 的方式进行重试。那么指数退避究竟是什么样的呢? 二、指数退避 根据 wiki 上对 Exponential backoff 的说明,指数退避是一种通过反馈,成倍地降低某个过程的速率,以逐渐找到合适速率的算法。 在以太网中,该算法通常用于冲突后的调度重传。根据时隙和重传尝试次数来决定延迟重传。 在 c 次碰撞后(比如请求失败),会选择 0 和 $2^c-1$ 之间的随机值作为时隙的数量。 对于第 1 次碰撞来说,每个发送者将会等待 0 或 1 个时隙进行发送。 而在第 2 次碰撞后,发送者将会等待 0 到 3( 由 $2^2-1$ 计算得到)个时隙进行发送。 而在第 3 次碰撞后,发送者将会等待 0 到 7( 由 $2^3-1$ 计算得到)个时隙进行发送。 以此类推…… 随着重传次数的增加,延迟的程度也会指数增长。

Java多线程与高并发:java.util.concurrent包

假如想象 提交于 2020-03-01 14:15:16
面试官:你用过JUC的哪些工具类? 前面从基础开始,到线程安全的实现、对象的发布与共享,涉及到很多线程安全的类与工具,JDK1.5开始,提供了更加方便强大的线程同步管理工具包JUC让我们使用,这个也是面试与实践中的重点,本文结合源代码作一些比较落地的讲解。 image 报告面试官,JUC中有非常多的类,将部分类按功能进行分类,分别是: 之前提到过的原子 atomic 包 比synchronized功能更强大的 lock 包 线程调度管理工具 线程安全与并发工具集合 线程池 AQS AbstractQueuedSynchronizer,即队列同步器。它是构建锁或者其他同步组件的基础框架,它是JUC并发包中的核心基础组件。 JUC大大提高了Java的并发能力,AQS是JUC的核心。 原理 image.png 同步队列 :AQS通过内置的FIFO同步队列来完成资源获取线程的排队工作,如果当前线程获取同步状态失败(锁)时,AQS则会将当前线程以及等待状态等信息构造成一个节点(Node)并将其加入同步队列,同时会阻塞当前线程,当同步状态释放时,则会把节点中的线程唤醒,使其再次尝试获取同步状态。 继承实现 :AQS的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法acquire/release来管理同步状态。 同步状态维护 :AQS使用一个int类型的成员变量state来表示同步状态

解决 Uncaught SyntaxError: Identifier &apos;countdown&apos; has already been declared

∥☆過路亽.° 提交于 2020-02-28 03:51:02
1、错误提示 Uncaught SyntaxError: Identifier 'countdown' has already been declared, 已声明标识符“countdown” 2、解决方法 排查 'countdown' 被引用的 js 文件,是否在同一个页面引入多次。 3、总结 经过排查有重复引用 js 文件(见下图代码23行和958行),去除一个即可。 来源: oschina 链接: https://my.oschina.net/hp2017/blog/3158906

java 什么时候使用CountDownLatch

无人久伴 提交于 2020-02-28 00:40:23
1、CountDownLatch是什么 CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它们都存在于java.util.concurrent包下。 CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行 。例如,应用程序的 主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行 。 CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。 每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务 。 CountDownLatch的伪代码如下所示: //Main thread start //Create CountDownLatch for N threads //Create and start N threads //Main thread wait on latch //N threads completes there tasks are returns //Main thread resume execution 2、CountDownLatch如何工作

计数器设计模式CountDown设计模式

橙三吉。 提交于 2020-02-27 13:40:09
计数器设计模式CountDown设计模式 当多个线程在执行完成时,要等待 一起提交结果 ,可以用join实现 JDK自带的CountDownLatch 很容易的实现了这一个功能,先看jdk怎么实现的 package com.thread.ch14 ; import java.util.Random ; import java.util.concurrent.CountDownLatch ; import java.util.stream.IntStream ; public class JdkCountDown { private static final Random random = new Random(System. currentTimeMillis ()) ; public static void main (String[] args) throws InterruptedException { CountDownLatch latch = new CountDownLatch( 4 ) ; //第一步線程操作 IntStream. range ( 1 , 5 ).forEach(i -> { new Thread(() -> { System. out .println(Thread. currentThread ().getName() + " is

JUC之CountDownLatch、Cyclicbarrier、Semaphore

被刻印的时光 ゝ 提交于 2020-02-26 23:38:57
JUC从JDK1.5开始,就是这个包里有很多工具类,这次介绍这三个大头。 CountDownLatch package com.juc; import java.util.concurrent.*; public class CountDownLatchTest { public static void main(String[] args) { //主线程 加载游戏资源 CountDownLatch count = new CountDownLatch(10); //十个子线程代表十个玩家正在加载游戏 ExecutorService exec = Executors.newFixedThreadPool(11); Runnable game = new Runnable() { @Override public void run() { try { count.await(); System.out.println("全部加载完毕!进入英雄联盟!"); } catch (InterruptedException e) { e.printStackTrace(); }finally { exec.shutdown(); } } }; exec.execute(game); for (int i = 0; i < 10; i++) { exec.execute(new Player(