文章目录

  • 一 环境初始化
  • 二 案例准备
  • 三 并发模拟-工具
    • 1. postman 并发测试步骤
    • 2. Apache Bench 并发模拟的性能测试
    • 3. JMeter 并发模拟的性能测试
  • 四 并发模拟-代码

一 环境初始化

  1. 现在码云上建立新仓库 Concurrency ,我的Concurrency
  2. 通过 https://start.spring.io/ 新建 spring boot 项目 concurrency
  3. 在本地Git仓库把 码云项目拉下来 git clone https://gitee.com/libinliu/Concurrency.git
  4. 将 步骤2中的项目信息复制到 本地仓库中
  5. git push 到远程仓库

二 案例准备

自定义部分注解来描述我们后面写的类的一些特性:
ThreadSafe 注解表示线程安全的类或者写法
NotThreadSafe 注解表示线程不安全的类或者写法
Recommend 注解表示推荐的类或者写法
NotRecommend 注解表示不推荐的类或者写法

ThreadSafe类示例


package com.hust.concurrency.annoations;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/**
* @Description 标记 [线程安全] 的类或者写法
* @since  2019年1月8日 下午2:29:03
* @author LiuLiBin
*///@Target 表示这个注解能放在什么位置上,是只能放在类上?还是即可以放在方法上,又可以放在属性上
//ElementType.TYPE :表示 能修饰类、接口或枚举类型
@Target(ElementType.TYPE) //@Retention 表示生命周期,
// RetentionPolicy.SOURCE: 注解只在源代码中存在,编译成class之后,就没了。@Override 就是这种注解@Retention(RetentionPolicy.SOURCE)public @interface ThreadSafe {/* 成员变量* 1. 注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型* * 2. 注解中定义属性时它的类型必须是 8 种基本数据类型外加 类、接口、注解及它们的数组* * 3. 如果注解只有一个成员,则成员名必须取名为 value() ,在使用时可以忽略成员名和赋值号(=)* * 4. 注解类可以没有成员,没有成员的注解称为标识注解* */String value() default "";
}

三 并发模拟-工具

1. postman 并发测试步骤

  1. 新开接口 localhost:8080/test,在postman中测试接口访问通过后,将接口保存在左侧的Collections中
  2. 开始并发测试

2. Apache Bench 并发模拟的性能测试

ApacheBench 是 Apache 服务器自带的一个web压力测试工具,简称ab。ab又是一个命令行工具,对发起负载的本机要求很低,根据ab命令可以创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问,因此可以用来测试目标服务器的负载压力。总的来说ab工具小巧简单,上手学习较快,可以提供需要的基本性能指标,但是没有图形化结果,不能监控。

  1. 下载与安装
    Apache Bench(AB)的下载、安装与访问

  2. ab的用法1

    1. 首先,我们输入cmd打开DOS窗口,然后将更改当前工作目录为:Apache安装目录/bin/。然后键入帮助命令ab -help(或者ab /?、ab -h),我们就可以看到用法介绍界面。
    2. ab可以配置的参数选项比较多,但是,一般情况下我们只需要使用形如ab -n 数字 -c 数字 url路径的命令即可。譬如,我们对位于本地Apache服务器上、URL为localhost/index.php的页面进行压力测试。测试总次数为1000,并发数为100(相当于100个用户同时访问,他们总共访问1000次)。我们输入DOS命令ab -n 1000 -c 100 localhost/index.php
    Server Software:        Apache/2.2.25 (服务器软件名称及版本信息)
    Server Hostname:        localhost (服务器主机名)
    Server Port:            80 (服务器端口)
    Document Path:          /index.php (供测试的URL路径)
    Document Length:        10 bytes (供测试的URL返回的文档大小)
    Concurrency Level:      100 (并发数)
    Time taken for tests:   0.247 seconds (压力测试消耗的总时间)
    Complete requests:      1000 (压力测试的总次数)
    Failed requests:        0 (失败的请求数)
    Write errors:           0 (网络连接写入错误数)
    Total transferred:      198000 bytes (传输的总数据量)
    HTML transferred:       10000 bytes (HTML文档的总数据量)
    Requests per second:    4048.34 [#/sec] (mean) (平均每秒的请求数)
    Time per request:       24.701 [ms] (mean) (所有并发用户(这里是100)都请求一次的平均时间)
    Time per request:       0.247 [ms] (mean, across all concurrent requests) (单个用户请求一次的平均时间)
    Transfer rate:          782.78 [Kbytes/sec] received (传输速率,单位:KB/s)
    

3. JMeter 并发模拟的性能测试

JMeter安装+配置+运行

  1. JMeter 简单使用
    添加线程组

    填写线程组信息

    添加Http请求

    完善 Http请求

    添加监听器监视请求结果

    运行请求并分析结果

四 并发模拟-代码

使用 CountDownLatch和 Semaphore 来模拟并发2模型3

ConcurrencyTest


package com.hust.concurrency.service;import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;import lombok.extern.slf4j.Slf4j;/**
* @Description  使用 [CountDownLatch]和 [Semaphore] 和  [ExecutorService] 来模拟并发状态。
* @since  2019年1月8日 下午8:37:54
* @author LiuLiBin
*/
@Slf4j
public class ConcurrencyTest {//请求总数public static int clientTotal = 1000;//同时并发执行的线程数public static int threadTotal = 50;//测试并发 的计数值public static int count = 0 ;public static void main(String[] args) throws InterruptedException {//定义线程池ExecutorService executorService = Executors.newCachedThreadPool();//定义信号量 ,信号量为 50final Semaphore semaphore = new Semaphore(threadTotal);//定义计数器闭锁 ,期望所有请求请求完后统计计数结果 final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);//放入请求,将请求线程全部放入线程池中for (int i = 0; i < clientTotal; i++) {executorService.execute(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubtry {semaphore.acquire(); // 获取一个许可add();semaphore.release(); // 释放一个许可} catch (Exception e) {log.error("exception", e);}countDownLatch.countDown(); // 计数器闭锁减1}});}//在所有线程请求执行完后 ,唤醒等待线程 ,此处涉及到countDownLatch 的实现机制countDownLatch.await();//关闭线程池executorService.shutdown();//打印计数值信息log.info("count:{}",count);}/*** 增加计数值*/private static void add() {count++;}
}

运行上面代码会发现,计数值不是固定不变的


  1. ab压力测试 ↩︎

  2. CountDownLatch什么时候用 ↩︎

  3. Semaphore原理 ↩︎

Java并发(3)--项目准备:环境初始化、案例准备、并发模拟工具、并发模拟代码相关推荐

  1. Java 并发在项目中的使用场景

    1.并发编程的三个核心问题: (1)分工:所谓分工指的是如何高效地拆解任务并分配给线程 (2)同步:而同步指的是线程之间如何协作 (3)互斥:互斥则是保证同一时刻只允许一个线程访问共享资源 (4)应用 ...

  2. 采用itextpdf 实现java的PDF生成与导出功能,含封装工具类代码

    引入jar包 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</a ...

  3. Java并发编程笔记—基础知识—实用案例

    如何正确停止一个线程 1)共享变量的使用 中断线程最好的,最受推荐的方式是,使用共享变量(shared variable)发出信号,告诉线程必须停止正在运行的任务.线程必须周期性的核查这一变量(尤其在 ...

  4. 我的新书《图解Java并发编程》上市啦!

    关于这本书 我的新书<图解Java并发编程>上市啦!大概六七年前,我在工作中经常遇到系统并发问题,于是我决定深入学习Java并发知识.也是在学习的过程中写了一个Java并发主题的专栏发布在 ...

  5. 【死磕Java并发】----- 死磕 Java 并发精品合集

    原文出处:https://www.cmsblogs.com/category/1391296887813967872 『chenssy』 [死磕 Java 并发]系列是 LZ 在 2017 年写的第一 ...

  6. 【Java并发编程】并发编程大合集

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容 ...

  7. Java并发编程的学习

    转载出处:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容按照由 ...

  8. 让人抓头的Java并发(四) 阻塞队列--CPU飙升排查案例

    在上一篇文章中给大家介绍了牛批的AQS,大致讲解了JUC中同步的思路.本来还没想好这一篇应该写点什么,刚好上周某个同事的代码出现问题,排查后发现是使用阻塞队列不当导致的,所以本篇决定介绍下阻塞队列. ...

  9. java 并发编程实例_Java并发编程案例解读

    经过前面几节的学习,了解了多线程概念.Thread类的应用.多线程数据同步存在的问题及解决方法.本节给出一个并发编程实例应用案例,通过案例的学习,可以灵活地把多线程知识应用到实际编程中,解决在项目开发 ...

最新文章

  1. 5年Python功力,总结了10个开发技巧
  2. 下载r包IlluminaHumanMethylation450kanno.ilmn12.hg19
  3. java高并发(十六)J.U.C之ForkJoin
  4. 阿里巴巴DevOps实践指南 | 为什么DevOps的必然趋势是BizDevOps?
  5. epoll或者kqueue的原理是什么?
  6. hdu4734 F(x)
  7. 24.root, alias
  8. NDK开发简单demo
  9. 使用站长工具进行目标域名登记查询
  10. 防止被偷窥和修改 Office文档保护秘笈
  11. 嵩天python笔记_嵩天Python学习笔记
  12. EasyUI Combobox 的 onChange,onSelect,onClick 事件
  13. 生物信息流程开发之甲基化分析pipeline
  14. buuctf crypto Quoted-printable
  15. 异常---编译时异常和运行时异常:IO异常、NullPointerException、ArrayIndexOutBoundsException、ClassCastExoeption
  16. win11壁纸怎么可以动 Windows11秒变动态壁纸的设置方法
  17. 计算机辅助牙种植,牙种植模型的计算机辅助设计和制作的应用研究
  18. CodeForces 757 E.Bash Plays with Functions(积性函数+dp)
  19. WordPress优化教程大全
  20. 用Windows Performance Toolkit(WPT)分析Vista系统

热门文章

  1. Javascript(六十三)网络协议
  2. 开源SNS(社会性网络服务)软件iweb SNS v0.7源码下载
  3. 【小记】远程办公经验
  4. 读后感___之大师德鲁克
  5. WebSocket 学习之认识websocket
  6. 从“非主流”到“潮流”,开源早已值得拥有
  7. 西工大机考《 现代设计方法》大作业网考
  8. 一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
  9. h5新增标签属性以及api
  10. dancer.js_与轻量级的Perl Web应用程序框架Dancer一起旋转