countdownlatch

性能测试框架第二版

吃可爱长大的小学妹 提交于 2019-12-06 12:16:57
依照领导要求区分了两种压测模式:固定次数压测和固定时间压测。此前一直沿用的都是固定次数,所以本次第二版剥离了固定次数的模式增加了固定时间的模式。 这是第一版: 性能测试框架 第二版的threadbase代码如下: package com.fun.base.constaint; import com.fun.frame.SourceCode; import java.util.concurrent.CountDownLatch; /** * 多线程任务基类,可单独使用 */ public abstract class ThreadBase<T> extends SourceCode implements Runnable { /** * 计数锁 * <p> * 会在concurrent类里面根据线程数自动设定 * </p> */ CountDownLatch countDownLatch; /** * 用于设置访问资源 */ public T t; protected ThreadBase() { super(); } /** * groovy无法直接访问t,所以写了这个方法 * * @return */ public String getT() { return t.toString(); } /** * 运行待测方法的之前的准备 */ protected abstract

Java并发编程 (一) 导读

天大地大妈咪最大 提交于 2019-12-06 10:52:19
一、并发编程相关技术栈 1、内容主要为高并发的解决思路与手段,具体涉及: ​ 2、涉及的基础知识与核心知识: ​ 3、并发及并发的线程安全处理 ​ 4、高并发的思路及手段 ​ 5、高并发所涉及的技术 总体架构: Spring Boot 、Maven、JDK8、MySQL 基础组件: Mybatis、Guava、Lombok、Redis、Kafka 高级组件(类): Joda-Time、Atomic包、J.U.C、AQS、ThreadLocal、RateLimiter、Hystrix、threadPool、shardbatis、curator、elastic-job、 二、并发编程初体验 1、简单的业务场景 实现一个计数功能 package com.mmall.concurrency.example.count; import com.mmall.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util

CountDownLatch、Semaphore等4大并发工具类详解

好久不见. 提交于 2019-12-06 08:46:35
Java并发工具包 1.并发工具类 提供了比synchronized更加高级的各种同步结构:包括CountDownLatch、CyclicBarrier、Semaphore等,可以实现更加丰富的多线程操作。 2.并发容器 提供各种线程安全的容器:最常见的ConcurrentHashMap、有序的ConcurrentSkipListMap,实现线程安全的动态数组CopyOnWriteArrayList等。 3.并发队列 各种BlockingQueue的实现:常用的ArrayBlockingQueue、SynchorousQueue或针对特定场景的PriorityBlockingQueue。 4.Executor框架 可以创建各种不同类型的线程池,调度任务运行等,绝大部分情况下,不再需要自己从头实现线程池和任务调度器。 Java常用的并发容器 1.ConcurrentHashMap 经常使用的并发容器,JDK 1.7和1.8的底层数据结构发生了变化(后续文章会详解),这里可以建议学习顺序如下:从Java7 HashMap -> Java7 ConcurrentHashMap -> Java8 HashMap -> Java8 ConcurrentHashMap,这样可以更好的掌握这个并发容器,毕竟都是从HashMap进化而来。 2.ConcurrentSkipListMap 在乎顺序

Synchronise concurrent requests to share results of a slow operation

江枫思渺然 提交于 2019-12-06 06:30:53
I have a Java UI service that has an API method that invokes an operation that's relatively slow (say ~30secs). The operation is parameterless, but it operates on external data that does change (relatively slowly) over time. It's not critical for the method to return the most up-to-date results - if they're 30secs old that's acceptable. Ultimately I need to optimise the implementation of the slow operation, but as a short-term fix, I'd like to make the operation mutually exclusive, such that if a second incoming request (on a separate thread) attempts to invoke the operation while another is

Java多线程编程(5)--线程间通信

荒凉一梦 提交于 2019-12-06 05:02:28
一.等待与通知   某些情况下,程序要执行的操作需要满足一定的条件(下文统一将其称之为保护条件)才能执行。在单线程编程中,我们可以使用轮询的方式来实现,即频繁地判断是否满足保护条件,若不满足则继续判断,若满足则开始执行。但在多线程编程中,这种方式无疑是非常低效的。如果一个线程持续进行无意义的判断而不释放CPU,这就会造成资源的浪费;而如果定时去判断,不满足保护条件就释放CPU,又会造成频繁的上下文切换。总之,不推荐在多线程编程中使用轮询的方式。   等待与通知是这样一种机制:当保护条件不满足时,可以将当前线程暂停;而当保护条件成立时,再将这个线程唤醒。一个线程因其保护条件未满足而被暂停的过程就被称为等待,一个线程使得其他线程的保护条件得以满足的时候唤醒那些被暂停的线程的过程就被称为通知。 1.wait   在Java平台中,Object.wait方法可以用来实现等待,下面是wait方法的三个重载方法: void wait(long timeoutMillis) 调用该方法会使线程进入TIMED_WAITING状态,当等待时间结束或其他线程调用了该对象的notify或notifyAll方法时会将该线程唤醒。 void wait(long timeoutMillis, int nanos) 这个方法看上去可以精确到纳秒级别,但实际上并不是。如果nanos的值在0~999999之间

CyclicBarrier让多线程齐步走

让人想犯罪 __ 提交于 2019-12-05 21:39:50
从JDK 1.5之后,在java.util.concurrent包下引入了好多的处理多线程的工具类,本文首先会介绍CyclicBarrier辅助工具类,其次将用CyclicBarrier工具类来完成一个实例,最后将给出CyclicBarrier和CountDownLatch的几点比较。 之前关于CountDownLatch的博文,请参考 使用CountDownLatch协调子线程 以前在<<编写高质量代码-改善Java程序的151个建议>>一书中看到有一节的标题是“ CyclicBarrier让多线程齐步走 ”,觉得这标题挺不错的,所以在写这篇博文的时候也采用了这个名字。 CyclicBarrier工具类介绍 CyclicBarrier描述 CyclicBarrier 是一个同步辅助工具类, 它允许一组线程相互等待,直到到达一个公共的栏栅点。 CyclicBarrier对于那些包含一组固定大小线程,并且这些线程必须不时地相互等待的程序非常有用 。之所以将其称之为循环的Barrier是因为该Barrier在等待的线程释放之后可以重用。 CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。

zookeeper集群(linux)和单机(windows)搭建

蹲街弑〆低调 提交于 2019-12-05 14:51:35
Zookeeper集群(linxu)搭建 环境 要求 : 必须要有jdk环境 ,本次 讲课使用 jdk1.8 3.1 结构 一共 三 个 节点 集群的服务器数量一般为2n+1个,(zk服务器集群规模不小于3个节点),要求服务器之间系统时间保持一致。 3.2 上传 zk 并且解压 进行解压: tar -zxvf zookeeper-3.4.6.tar.gz 重命名: mv zookeeper-3.4.6 zookeeper 3.3 修改 zookeeper 环境变量 vi /etc/profile export JAVA_HOME=/opt/jdk1.8.0_71 //jdk安装目录 export ZOOKEEPER_HOME=/usr/local/zookeeper //zookeeper安装目录 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH source /etc/profile //使修改的配置生效 3.4 修改 zoo_sample.cfg 文件 //将zoo_sample.cfg的名称更改为 zoo.cfg cd /usr/local/zookeeper/conf mv zoo

zookeeper分布式锁用法

我与影子孤独终老i 提交于 2019-12-05 14:10:30
package com.example.demo3.zk; import lombok.extern.slf4j.Slf4j; import org.apache.storm.shade.org.apache.zookeeper.*; import java.util.concurrent.CountDownLatch; /** * Zookeeper 初始化,获取锁,释放锁。创建临时锁。 */ @Slf4j public class ZooKeeperSession { private static CountDownLatch countDownLatch=new CountDownLatch(1); private ZooKeeper zooKeeper; //目录 private String lockPath="/orderId-lock-"; /** * 连接zookeeper */ public ZooKeeperSession(){ try { //连接zk服务器 this.zooKeeper=new ZooKeeper("192.168.132.154:2181,192.168.132.156:2181,192.168.132.155:2181", 50000,new ZooKeeperWatcher()); log.info("状态:"+zooKeeper

leetCode例题引出的多线程CountDownLatch和CyclicBarrier使用例题

╄→尐↘猪︶ㄣ 提交于 2019-12-05 07:16:07
先介绍下 CountDownLatch 和CyclicBarrier; CountDownLatch : new CountDownLatch( n ), 初始化时会赋值,并且不可以重新赋值。 countDown() ,值减1,操作,当值为0时,会跳过所有的阻塞方法await(); await(),阻塞方法,一直阻塞到值为0; CyclicBarrier: new CyclicBarrier(m ),m代表着,每次阻拦的阈值,当阻拦的await方法的个数等于m时,所有的阻塞方法则会跳过。 然后开始阻塞下一批线程,每批数量为m。 await(),阻塞方法,每次阻塞的格式为m。 题目1115: 我们提供一个类: class FooBar { public void foo() { for (int i = 0; i < n; i++) { print("foo"); } } public void bar() { for (int i = 0; i < n; i++) { print("bar"); } } } 两个不同的线程将会共用一个 FooBar 实例。其中一个线程将会调用 foo() 方法,另一个线程将会调用 bar() 方法。 请设计修改程序,以确保 "foobar" 被输出 n 次。 线上最受赞答案: 1 import java.util.concurrent

java 中 CountDownLatch、CyclicBarrier 和 Semaphore 的简单使用

二次信任 提交于 2019-12-05 04:35:40
一、CountDownLatch 1.1 概述 让一些线程阻塞直到另外一些完成后才被唤醒。 该类主要有两个方法,当一个或多个线程调用 await 方法时,调用线程会被阻塞。其他线程调用 countDown方法计数器减1(调用countDown方法时线程不会阻塞),当计数器的值变为0,因调用 await 方法被阻塞的线程会被唤醒继续执行。 1.2 模拟场景 有 6 名学生上完课后,离开教室,但他们离开的时间不相同,班长需要最后一个离开,锁上教室的门。 1.3 程序模拟 1.3.1 使用 CountDownLatch 之前 1 public void closeDoor() { 2 3 for (int i = 1; i <= 6; i++) { 4 new Thread(() -> { 5 System.out.println(Thread.currentThread().getName() + " 离开教室"); 6 }, String.valueOf(i)).start(); 7 } 8 9 System.out.println(Thread.currentThread().getName() + " 班长锁门离开教室"); 10 } 1.3.2 使用 CountDownLatch 之后 1 public void closeDoor() throws