countdownlatch

Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

匿名 (未验证) 提交于 2019-12-02 21:53:32
Java并发编程:CountDownLatch、CyclicBarrier和Semaphore   在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。   以下是本文目录大纲:   一.CountDownLatch用法   二.CyclicBarrier用法   三.Semaphore用法   若有不正之处请多多谅解,并欢迎批评指正。   请尊重作者劳动成果,转载请标明原文链接:   http://www.cnblogs.com/dolphin0520/p/3920397.html    一.CountDownLatch用法   CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。   CountDownLatch类只提供了一个构造器: 1 public CountDownLatch( int //参数count为计数值 1 2 3 public void throws //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行 public

并发工具类:倒计时器-CountDownLatch

霸气de小男生 提交于 2019-12-02 21:48:57
title: 并发工具类:倒计时器-CountDownLatch author: Enjoyitlife.top date: 2019-10-01 10:51:33 summary: JUC包中的工具类CountDownLatch到底给我们提供了什么功能? categories: Concurrent tags: Concurrent-Tools 并发工具类:倒计时器-CountDownLatch CountDownLatch是JDK1.5提供一个并发编程辅助类,用于控制一个和多个线程进行等待,直到其他线程完成后在执行任务。 常用方法: CountDownLatch latch= new CountDownLatch(10); 构造方法,设定计数值,即要等待的线程数量。 void countDown() 计数器的值减1,直到为0 void await() 阻塞等待,直到计数器的值为0 long getCount() 获取当前计数器的值 应用场景 1:实现多个N个线程并行运行 平常用于在创建N个线程来,验证接口的性能。 public class CountDownLatchTest { public static void main(String[] args) { CountDownLatch latch= new CountDownLatch(5); try { for(int

ReadWriteLock: 读写锁

跟風遠走 提交于 2019-12-02 21:36:25
ReadWriteLock: 读写锁 ReadWriteLock: JDK1.5提供的读写分离锁,采用读写锁分离可以有效帮助减少锁竞争。 特点: 1).使用读写锁。当线程只进行读操作时,可以允许多个线程同时读 2).写写操作,读写操作间依然需要相互等待和持有锁。 一).使用读写锁与使用重入锁进行读读写操作 开启200个线程,测试读写锁和重入锁的读效率。 使用重入锁进行读写操作: ReentrantLock_Rw import java.util.concurrent.locks.ReentrantLock; /** * 使用重入锁进行读写操作 * 线程的读写使用同一把锁。 */ public class ReentrantLock_RW { private static ReentrantLock lock = new ReentrantLock(); private static int value ; //读操作 public Object handleRead() throws InterruptedException { try { //获取锁 lock.lock(); //模拟读操作,读操作耗时越多,读写锁的优势越明显 Thread.sleep(1); return value; }finally { lock.unlock(); } } /** * 写操作 */

线程池辅助工具类枚举

99封情书 提交于 2019-12-02 19:22:07
java.util.concurrent(J.U.C)大大提高了并发性能,AQS 被认为是 J.U.C 的核心。 CountdownLatch 用来控制一个线程等待多个线程。 维护了一个计数器 cnt,每次调用 countDown() 方法会让计数器的值减 1,减到 0 的时候,那些因为调用 await() 方法而在等待的线程就会被唤醒。 原理就是await时加共享锁,countDown时释放共享锁 public class CountdownLatchExample { public static void main(String[] args) throws InterruptedException { final int totalThread = 10; CountDownLatch countDownLatch = new CountDownLatch(totalThread); ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 0; i < totalThread; i++) { executorService.execute(() -> { System.out.print("run.."); countDownLatch.countDown(); }); }

实现多线程同步 CountDownLatch

ぐ巨炮叔叔 提交于 2019-12-02 15:39:45
原文链接:https://blog.csdn.net/QQxiaoqiang1573/article/details/83008332 方法很少: 1、public CountDownLatch(int count) 构造函数,需传入计数的总数。 2、public void await() 阻塞线程,直到总计数值为0 3、public void countDown() 当前总计数减一 4、public long getCount() 当前总计数 下面是一个例子,可以使十个线程同时进行操作 final CountDownLatch latch = new CountDownLatch(1); int threadCount = 10; for (int i = 0; i < threadCount; i++) { final int finalI = i; new Thread() { @Override public void run() { try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } Log.d(TAG, "run: "+ finalI); } }.start(); } latch.countDown(); 来源: https://www.cnblogs.com

CountDownLatch使用初窥

家住魔仙堡 提交于 2019-12-02 15:13:38
文章目录 1. 背景 2. 使用方式 3. 业务核心代码 4. 程序人生&一点感想 1. 背景 最近,在做大数据方面的开发工作,对JAVA中线程之间的竞争和先后执行顺序产生了疑问,因此学习一下并发编程的高级写法,这边主要讲解一下CountDownLatch的使用方式。 2. 使用方式 我们在进行大数据操作的时候,需要分阶段分步骤进行数据操作,比如,在大数据分析中,我们首先要对数据进行去重,并进行数据预处理操作。针对文本操作的NLP方式,还需要将数据向量化。因此,在工程领域,我们可以定义整个数据的加工过程,并实现自动化操作。以下,来看下今天的实验: 我们要实验以下这个图,1.1和1.2并行,2必须等1.1和1.2结束后串行。然后3.1、3.2、3.3并行,同理,4必须等3操作执行完后才能操作,我们应该怎么实现以下的流程图呢? 看下面的例子背景: package chapter1 ; import java . util . concurrent . CountDownLatch ; public class MyThread1 extends Thread { public String order ; public static CountDownLatch cd ; public MyThread1 ( String order , CountDownLatch cd ) {

Zookeeper再linux 下的一些操作

一世执手 提交于 2019-12-02 08:51:51
zookeeper的安装目录:/usr/local/zookeeper-3.4.6/bin/zkServer.sh; 配置文件路径:../conf/zoo.cfg 端口 :2181; ZooKeeper服务命令: 在准备好相应的配置之后,可以直接通过zkServer.sh 这个脚本进行服务的相关操作 1. 启动ZK服务: sh bin/zkServer.sh start 2. 查看ZK服务状态: sh bin/zkServer.sh status 3. 停止ZK服务: sh bin/zkServer.sh stop 4. 重启ZK服务: sh bin/zkServer.sh restart zk客户端命令 ZooKeeper命令行工具类似于 Linux 的shell环境,不过功能肯定不及shell啦,但是使用它我们可以简单的对ZooKeeper进行访问,数据创建,数据修改等操作. 使用 ./zkCli.sh -server 127.0.0.1:2181 连接到 ZooKeeper 服务 ,连接成功后,系统会输出 ZooKeeper 的相关环境以及配置信息。 命令行工具的一些简单操作如下: 1. 显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容 2. 显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据 3. 创建文件

volatile和synchronized区别

你。 提交于 2019-12-02 05:47:27
volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级,相比使用synchronized所带来的庞大开销,倘若能恰当的合理的使用volatile,自然是美事一桩。 为了能比较清晰彻底的理解volatile,我们一步一步来分析。首先来看看如下代码 public class TestVolatile { boolean status = false; /** * 状态切换为true */ public void changeStatus(){ status = true; } /** * 若状态为true,则running。 */ public void run(String t){ if(status){ System.out.println("running...." + t); } } } 上面这个例子,在多线程环境里,假设线程A执行changeStatus()方法后,线程B运行run()方法,可以保证输出"running....."吗?   答案是NO!   这个结论会让人有些疑惑,可以理解。因为倘若在单线程模型里,先运行changeStatus方法,再执行run方法,自然是可以正确输出"running...."的;但是在多线程模型中

(五)多线程------Java并发包

送分小仙女□ 提交于 2019-12-02 05:23:29
文章目录 什么是线程安全问题? ConcurrentMap解析 CountDownLatch CyclicBarrier Semaphore 并发队列 ConcurrentLinkedQueue BlockingQueue ArrayBlockingQueue LinkedBlockingQueue PriorityBlockingQueue SynchronousQueue 使用BlockingQueue模拟生产者与消费者 什么是线程安全问题? 保证在多个线程之间共享同个全部变量或静态变量,保证数据的一致性和原子性。 ConcurrentMap解析 ConcurrentMap接口下有俩个重要的实现 : ConcurrentHashMap ConcurrentskipListMap (支持并发排序功能。弥补ConcurrentHas hMa p) ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个 小的HashTable,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并 发进行。把一个整体分成了16个段(Segment.也就是最高支持16个线程的并发修改操作。 这样的话,当多个线程进行add添加的时候,此时他添加的可能是其他的Segment,相当于 Segment把同步访问的压力进行了分散

多线程笔记一 --- CountDownLatch

时光毁灭记忆、已成空白 提交于 2019-12-01 20:37:32
一、代码使用样例 通过CountDownLatch实现:"主线程"等待"5个子线程"全部都完成"指定的工作(休眠1000ms)"之后,再继续运行。 import java.util.concurrent.CountDownLatch; public class CountDownLatchTest { private static CountDownLatch latch = new CountDownLatch(5); public static void main(String[] args) { System.out.println("Main Thread start...."); System.out.println(); for (int i = 0; i < 5; i++) { new InnerThread().start(); } try { latch.await(); System.out.println(); System.out.println("Main Thread latch.getCount = " + latch.getCount()); } catch (InterruptedException e) { System.out.println("Exception happened in latch await: " + e); }