countdownlatch

设计模式

与世无争的帅哥 提交于 2019-12-01 04:34:17
设计模式分类 创建型模式: 单例模式、工厂模式、抽象工程模式、建造者模式、原型模式 结构型模式 适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式 行为型模式 模板方法模式、命令模式、迭代器模式、观察者模式、终结者模式、备忘录模式、揭示其模式、状态模式、策略模式、职责链模式、访问者模式 单例模式 核心作用 保证一个类只有一个实例,并且提供一个访问该实力的全局访问点 创建场景 Windows的任务管理器 Windows的回收站 项目中读取配置文件的类 网站的计数器 应用程序的日志应用 数据库连接池 操作系统文件系统 Application(servlet编程中会涉及) Spring中,每个Bean默认是单例模式,Spring容器可以管理 servlet编程中,servlet也是单例 Spring MVC框架/struts1框架中,控制器对象也是单例 优点 由于单例模式只生成一个实例,减少了系统性能的开销,当一个对象的产生需要比较多的资源时,可以通过应用启动时直接产生一个实例对象,然后永久驻留内存的方式来解决 单例模式可以在系统设置全举办的访问点,优化环共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理 常见的5中单例模式实现方式 主要: 饿汉式(线程安全,调用效率高。但是,不能延时加载。) 懒汉式(线程安全,调用效率不高。但是,可以延时加载。) 其他:

CyclicBarrier和CountDownLatch区别

梦想与她 提交于 2019-12-01 02:24:20
CountDownLatch CyclicBarrier 减计数方式 加计数方式 计算为0时释放所有等待的线程 计数达到指定值时释放所有等待线程 计数为0时,无法重置 计数达到指定值时,计数置为0重新开始 调用countDown()方法计数减一,调用await()方法只进行阻塞,对计数没任何影响 调用await()方法计数加1,若加1后的值不等于构造方法的值,则线程阻塞 不可重复利用 可重复利用 一、CountDownLatch用法 CountDownLatch类只提供了一个构造器: public CountDownLatch(int count) { }; //参数count为计数值 然后下面这3个方法是CountDownLatch类中最重要的方法: public void await() throws InterruptedException { }; //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行 public boolean await(long timeout, TimeUnit unit) throws InterruptedException { }; //和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行 public void countDown() { }; //将count值减1

JUC五种常见同步工具类总结

两盒软妹~` 提交于 2019-12-01 02:21:34
JUC常用工具类 Semaphore CountDownLatch CyclicBarrier Exchanger Phaser 使用场景 这五种同步辅助类适用于的同步场景: 1、Semaphore 信号量是一类经典的同步工具。信号量通常用来限制线程可以同时访问的(物理或逻辑)资源数量。 2、CountDownLatch 一种非常简单、但很常用的同步辅助类。其作用是在完成一组正在其他线程中执行的操作之前,允许一个或多个线程一直阻塞。 3、CyclicBarrier 一种可重置的多路同步点,在某些并发编程场景很有用。它允许一组线程互相等待,直到到达某个公共的屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier在释放等待线程后可以重用,所以称它为循环的barrier。 4、Phaser一种可重用的同步屏障,功能上类似于CyclicBarrier和CountDownLatch,但使用上更为灵活。非常适用于在多线程环境下同步协调分阶段计算任务(Fork/Join框架中的子任务之间需同步时,优先使用Phaser) 5、Exchanger允许两个线程在某个汇合点交换对象,在某些管道设计时比较有用。Exchanger提供了一个同步点,在这个同步点,一对线程可以交换数据

SpringBoot 系列 | 第十篇:使用RabbitMQ收发消息

生来就可爱ヽ(ⅴ<●) 提交于 2019-11-30 22:32:01
SpringBoot 系列 | 第十篇:使用RabbitMQ收发消息 本篇文章参考了官方文档: Messaging with RabbitMQ Spring Boot中使用RabbitQM需要机器安装好RabbitMQ。没有了解RabbitMQ的可以参考一下文章: RabbitMq使用 | 第一篇:安装和Hello World RabbitMq使用 | 第二篇:消息队列和确认 RabbitMQ使用 | 第三篇:发布/订阅模式 RabbitMQ 使用 | 第四篇:路由选择 添加依赖 < dependency > < groupId > org.springframework.boot </ groupId > < artifactId > spring-boot-starter-amqp </ artifactId > </ dependency > 配置 spring .rabbitmq .host = 120.55 .72 .39 spring .rabbitmq .port = 5672 spring .rabbitmq .username =guest spring .rabbitmq .password =guest 创建一个消息接受者 @Component public class Receiver { private CountDownLatch latch = new

springboot 官方例子中文翻译--RabbitMQ 进行消息队列发布和订阅

[亡魂溺海] 提交于 2019-11-30 21:39:11
本次我们讲述使用Springboot来操作 RabbitMQ 发布和订阅消息。消息队列在实际开发中经常用到,主要做了处理大规模数据,及模块解耦。而RabbitMQ是目前最热的消息队列之一,本例你可以学到RabbitMQ安装和使用。 我利用业余时间,翻译了Spring官网的例子,方便中文不好的同学,将陆续发到CSDN上,欢迎大家关注,也可以上我个人BLOG: itmanclub.com ,上面有已经翻译过的。 正文: ** 程序结构** └── src └── main └── java └── hello ** pom.xml文件** <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.springframework</groupId>

@Async源码探究

做~自己de王妃 提交于 2019-11-30 18:54:48
1. @Async 源码探究 1.1. 上代码 @SpringBootApplication @EnableAsync public class SpringbootLearnApplication { public static void main(String[] args) { SpringApplication.run(SpringbootLearnApplication.class, args); } } @Service public class CreatingThread08Service { @Async public void call(CountDownLatch countDownLatch) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " is running"); countDownLatch.countDown(); System.out.println(Thread.currentThread().getName() + " is over"); } } @RunWith(SpringRunner.class)

JUC——线程同步辅助工具类(Semaphore,CountDownLatch,CyclicBarrier)

爷,独闯天下 提交于 2019-11-30 18:10:13
CountDownLatch CountDownLatch是一个计数器闭锁,通过它可以完成类似于阻塞当前线程的功能,即:一个线程或多个线程一直等待,直到其他线程执行的操作完成。CountDownLatch用一个给定的计数器来初始化,该计数器的操作是原子操作,即同时只能有一个线程去操作该计数器。调用该类await方法的线程会一直处于阻塞状态,直到其他线程调用countDown方法使当前计数器的值变为零,每次调用countDown计数器的值减1。当计数器值减至零时,所有因调用await()方法而处于等待状态的线程就会继续往下执行。这种现象只会出现一次,因为计数器不能被重置,如果业务上需要一个可以重置计数次数的版本,可以考虑使用CycliBarrier。 在某些业务场景中,程序执行需要等待某个条件完成后才能继续执行后续的操作;下面举个栗子,比如秦国需要灭六国才能一统华夏。 代码示例: public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(6); for (int i = 1; i <= 6; i++) { new Thread(() ->

CountDownLatch 初识

拜拜、爱过 提交于 2019-11-30 16:47:55
前言 在 JDK 并发包提供了几个非常有用的并发工具类。CountDownLatch,CyclicBarrier 和 Semaphore 工具类提供了一种并发流程控制手段,Exchanger 工具类则提供了在线程间交换数据的一种手段。这篇文章主要了解 CountDownLatch 和 CyclicBarrier。 CountDownLatch 假如有这样一个需求:我们需要解析一个 Excel 里面的多个 sheet 页的数据,此时可以考虑使用多线程,每个线程解析一个 sheet 页,等到所有的的 sheet 页都解析完之后,程序需要提示解析完成。在这个需求中,要实现主线程等待所有解析线程完成 sheet 的解析操作有两种方式,第一种是 join,第二种就是我们今天要说的是 CountDownLatch。 join public class JoinTest { public static void main(String[] args) throws InterruptedException { Thread parserThread01 = new Thread(new Runnable() { @Override public void run() { System.out.println("sheet1 parse finished!"); } }); Thread

Put one thread to sleep until a condition is resolved in another thread

こ雲淡風輕ζ 提交于 2019-11-30 13:13:16
问题 Here are two chunks of code that accomplish (what I think is) the same thing. I basically am trying to learn how to use Java 1.5's concurrency to get away from Thread.sleep(long). The first example uses ReentrantLock, and the second example uses CountDownLatch. The jist of what I am trying to do is put one thread to sleep until a condition is resolved in another thread. The ReentrantLock provides a lock on the boolean I'm using to decide whether to wake the other thread or not, and then I use

同步器

≡放荡痞女 提交于 2019-11-30 11:59:20
版权声明:本文为博主转载文章 原文链接: https://blog.csdn.net/lixiaobuaa/article/details/78995572 线程之间相互合作时,需要用到同步器来完成同步,下面介绍几种常用同步器: 1.Semaphore(信号量) 信号量数量限制了访问资源的线程总数,线程请求会消耗一个信号量,当信号量为0时,新的线程会阻塞,直到有线程释放了一个信号量 线程类: package Semaphore; import java.util.concurrent.Semaphore; public class SemaphoreThread extends Thread { Semaphore semaphore; public SemaphoreThread (Semaphore semaphore){ this .semaphore = semaphore; } @Override public void run () { try { semaphore.acquire(); System.out.println( "一个线程正在执行" ); sleep( 3000 ); System.out.println( "一个线程结束运行" ); } catch (InterruptedException e) { e.printStackTrace(); }