Java模拟高并发测试
线程类,设置有一个公共资源
package cn.org.chris.concurrent;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* @Description: 线程类
* @Author:Richice
* @Date:2021/2/23
*/
public class MyRunnable implements Runnable{
public volatile static Boolean isTrue=true;//公共资源
public static Lock lock = new ReentrantLock();//如果不使用同步锁,多线程并发一定会出现并发安全问题 使用volatile关键字在高并发下不能完全保证线程安全
@Override
public void run() {
try {
String name = Thread.currentThread().getName();
if(lock.tryLock()){ if(isTrue==true){
System.out.println("我是第一个抢到资源的线程,我是"+name);
System.out.println("处理业务花费1ms");
try {
Thread.sleep(1);
System.out.println("再次查看资源状态"+isTrue);
if(isTrue==true){
System.out.println("资源没有被更改");
isTrue=false;
}else{
System.out.println("资源已经被更改");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
System.out.println("资源已经被更改,我什么事也没做,我是线程"+name);
}
}else{
System.out.println("我没有拿到锁,我是线程"+name);
}
} finally {
//这里必须要先获取保证未释放才能释放锁 而且这里必须要释放锁
if(lock.tryLock()){
lock.unlock();
}
}
}
}
测试线程类
package cn.org.chris.concurrent; import java.util.concurrent.CountDownLatch; /**
* @Description: 并发测试
* @Author:Richice
* @Date:2021/2/23
*/
public class ConcurrentTest { public static void concurrent(int threadNum,Runnable runnable){
CountDownLatch gate= new CountDownLatch(1);
CountDownLatch end= new CountDownLatch(threadNum);
for (int i = 0; i <threadNum ; i++) {
new Thread(()->{
try {//所有的线程会卡到这里
gate.await();
runnable.run();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
end.countDown();
}
}).start();
}
long beginTime = System.currentTimeMillis();
//所有的线程同时争夺资源
gate.countDown();
try {
end.await();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
long endTime = System.currentTimeMillis();
System.out.println("所有线程执行结束时间:"+(endTime-beginTime));
}
} public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
concurrent(100,myRunnable);
}
}
测试结果 :使用锁能保证只有一个线程拿到资源 不过这只是单机下的线程安全方法 如果是分布式架构 或者多实例 必须使用分布式锁比如使用Redis、Zookeeper或者数据库
使用volatile也会出现并发安全问题
测试结果
Java模拟高并发测试的更多相关文章
- CountDownLatch模拟高并发测试代码
直接上代码进行验证吧 /** * 通过countdownlatch的机制,来实现并发运行 * 模拟200个并发测试 * @author ll * @date 2018年4月18日 下午3:55:59 ...
- Java高并发测试框架JCStress
前言 如果要研究高并发,一般会借助高并发工具来进行测试.JCStress(Java Concurrency Stress)它是OpenJDK中的一个高并发测试工具,它可以帮助我们研究在高并发场景下JV ...
- springboot2.0+线程池+Jmeter以模拟高并发
声明:原创在这里https://blog.csdn.net/u011677147/article/details/80271174,在此也谢谢哥们. 1.目录结构 2.BusinessThread.j ...
- java处理高并发高负载类网站的优化方法
java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,java高负载数据) 一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF ...
- 使用CountDownLatch模拟高并发场景
import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java ...
- [转]java处理高并发高负载类网站的优化方法
本文转自:http://www.cnblogs.com/pengyongjun/p/3406210.html java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,ja ...
- Jmeter之仿真高并发测试-集合点
场景: 大家在使用Jmeter测试的时候应该发现了, (1)线程启动了就会直接发送测试请求:--如果要模拟在一瞬间高并发量测试的时候,需要调高线程数量,这很耗测试机器的性能,往往无法支持较大的并发数, ...
- 基于Java的高并发多线程分片断点下载
基于Java的高并发多线程分片断点下载 首先直接看测试情况: 单线程下载72MB文件 7线程并发分片下载72MB文件: 下载效率提高2-3倍,当然以上测试结果还和设备CPU核心数.网络带宽息息相关. ...
- Java接口多线程并发测试 (一)
本文为作者原创,禁止转载,违者必究法律责任!!! 本文为作者原创,禁止转载,违者必究法律责任!!! Java接口多线程并发测试 一,首先写一个接口post 请求代码: import org.apach ...
- Java 多线程高并发编程 笔记(一)
本篇文章主要是总结Java多线程/高并发编程的知识点,由浅入深,仅作自己的学习笔记,部分侵删. 一 . 基础知识点 1. 进程于线程的概念 2.线程创建的两种方式 注:public void run( ...
随机推荐
- Codeforces Round 932 (Div. 2) ABCD
A. Entertainment in MAC 题意:给定字符串 \(S\),有两种操作,每次操作其中之一: 把 \(S\) 变为 \(S\) 的翻转 \(T\). 把 \(S\) 变为 \(S + ...
- python教程6.5-excel处理模块
第三方开源模块安装 创建文件 打开已有文件 写数据 选择表 保存表 遍历表 按行遍历 按列遍历 遍历指定行列 遍历指定第几列数据 删除表 设置单元格样式 字体 对齐 设置行高列宽
- ABP-VNext 用户权限管理系统实战06---实体的创建标准及迁移
在apb-vnext的实体的创建中可以确实字段的长度.说明.对应的表.表中给字段加的索引 以项目中的订单表为例,如下: [Comment("订单主表")] [Table(" ...
- TeamViewer 9 和 10 即将停用 尝试切换到 Splashtop
TeamViewer 9 和 TeamViewer 10 将于2021 年 6 月 1 日到期停用.当这两个版本的 TeamViewer 到期时,用户将无法再远程访问其计算机和设备. 这意味着要继续使 ...
- turltle模块详解
引言:turtle(海龟)模块,我们是用它来进行画图的,基本上就是画简单的直线,点,和曲线. 你可以把它想成一个小海龟,在沙滩上行走,然后留下的各种痕迹,使用Turtle模块可以绘制很多精美的图形. ...
- 用友u8 使用 api资源管理器新增单据的一些方法
一般都使用传xml对象的方式.这种方式方便在只需传入正确的视图就行了.但是如果字段不全,或者字段的数据类型与api要求的不服,会报些莫名其妙的错误,比如这些: 项目大类0不存在项目大类0不存在货位不合 ...
- Vue cli之传递数据
1.父组件的数据传递给子组件 // 父组件 <Menu title="来自Home的数据" :clickNum="num"></Menu> ...
- mac goland go env 环境变量 和 mac上终端go env 不一样
编辑 vim ~/.zshrc. 在这里设置环境变量.goland 里面的才会生效.设置bash_profile 没用.
- 音视频学习-exceeded mem limit: ActiveHard 50 MB (fatal)
一.现象 ReplayKit2 适配中 UPLOAD进程被系统杀掉 日志中显示原因:exceeded mem limit: ActiveHard 50 MB (fatal) 二.内存占用分析 1)系统 ...
- 【论文笔记】YOLO系列
[深度学习]总目录 YOLOv1:<You Only Look Once: Unified, Real-Time Object Detection>one-stage的开山之作,将目标检测 ...