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( ...
随机推荐
- sh角本操作数据库
#!/bin/bash HOST="127.0.0.1" PORT="3306" USERNAME="root" PASSWORD=&quo ...
- 在Docker内部使用gdb调试器报错-Operation not permitted
在docker内部使用gdb调试时刻遇到了gdb如下报错信息: warning: Error disabling address space randomization: Operation not ...
- QQ/钉钉远程控制和商业远程控制哪个好用
提到远程协助.远程控制,你会想到什么? 国内最古老.最被用户熟知的,大概就是QQ远程控制了.QQ远程控制,方便易用.打开聊天窗口,点窗口上方"-",再移动到如图所示的电脑-箭头图标 ...
- Django中的ORM转换为SQL语句日志
如果想打印ORM转换过程中的SQL,需要在settings中进行如下配置: LOGGING = { 'version': 1, 'disable_existing_loggers': False, ' ...
- 微软官方开源免费的Blazor UI组件库 - Fluent UI Blazor
前言 今天大姚给大家分享一个由微软官方开源(MIT License).免费的Blazor UI组件库:Fluent UI Blazor. 全面的ASP.NET Core Blazor简介和快速入门 F ...
- Java中对的创建与引用
对象与引用 Java语言中除了基本数据类型以外都属于引用类型 Java中的对象是通过引用对其操作的 class Car{ String name; String color; int price; } ...
- 语义化结构标签 多媒体标签 H5新增表单内容
语义化结构标签: section 更偏向于一个区域类似div(块) article 更偏向于显示内容(块) aside 标签作为article呢绒的辅助板块(块) header 标签做为一个网页头部 ...
- vmware 虚拟WIN10 chrome核心浏览器部分菜单花掉
解决方法:在vmware 显示器设置中,关闭"加速 3D 图形".
- django跨域设置
Django 跨域问题,解决前后端连接 CORS 1.安装 django-cors-headers pip install django-cors-headers 2.配置settings 在 INS ...
- java和javac编译和运行记事本编写的代码
演示代码如下: package com.springboot.demo; public class Hello { public static void main(String[] args) { S ...