线程类,设置有一个公共资源

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模拟高并发测试的更多相关文章

  1. CountDownLatch模拟高并发测试代码

    直接上代码进行验证吧 /** * 通过countdownlatch的机制,来实现并发运行 * 模拟200个并发测试 * @author ll * @date 2018年4月18日 下午3:55:59 ...

  2. Java高并发测试框架JCStress

    前言 如果要研究高并发,一般会借助高并发工具来进行测试.JCStress(Java Concurrency Stress)它是OpenJDK中的一个高并发测试工具,它可以帮助我们研究在高并发场景下JV ...

  3. springboot2.0+线程池+Jmeter以模拟高并发

    声明:原创在这里https://blog.csdn.net/u011677147/article/details/80271174,在此也谢谢哥们. 1.目录结构 2.BusinessThread.j ...

  4. java处理高并发高负载类网站的优化方法

    java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,java高负载数据) 一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF ...

  5. 使用CountDownLatch模拟高并发场景

    import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java ...

  6. [转]java处理高并发高负载类网站的优化方法

    本文转自:http://www.cnblogs.com/pengyongjun/p/3406210.html java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,ja ...

  7. Jmeter之仿真高并发测试-集合点

    场景: 大家在使用Jmeter测试的时候应该发现了, (1)线程启动了就会直接发送测试请求:--如果要模拟在一瞬间高并发量测试的时候,需要调高线程数量,这很耗测试机器的性能,往往无法支持较大的并发数, ...

  8. 基于Java的高并发多线程分片断点下载

    基于Java的高并发多线程分片断点下载 首先直接看测试情况: 单线程下载72MB文件 7线程并发分片下载72MB文件: 下载效率提高2-3倍,当然以上测试结果还和设备CPU核心数.网络带宽息息相关. ...

  9. Java接口多线程并发测试 (一)

    本文为作者原创,禁止转载,违者必究法律责任!!! 本文为作者原创,禁止转载,违者必究法律责任!!! Java接口多线程并发测试 一,首先写一个接口post 请求代码: import org.apach ...

  10. Java 多线程高并发编程 笔记(一)

    本篇文章主要是总结Java多线程/高并发编程的知识点,由浅入深,仅作自己的学习笔记,部分侵删. 一 . 基础知识点 1. 进程于线程的概念 2.线程创建的两种方式 注:public void run( ...

随机推荐

  1. css的animate做一个信号动画

    html <div class="jump flex-fs fadeAndScaleIn"> <span></span> <span> ...

  2. foreach更改element内容后this到data不生效导致页面数据无变化

    list.forEach(element => {  element = element.split('^')    console.log(element)  }) 数据已经被更改,但在外部t ...

  3. Go pprof 认知到实践

    快速开始 测试环境:go version go1.22.2 windows/amd64,源代码开源在 https://github.com/oldme-git/teach-study/tree/mas ...

  4. PageOffice 6 保存数据区域数据同时保存文档

    在实际应用中,例如在线签订合同的时候,合同的签订日期,合同号等等这些信息既要保存到数据库,合同签订后又要将整个合同文件保存起来.这时候就需要用到PageOffice的保存数据区域数据的同时保存整个文件 ...

  5. pytorch(GPU版)安装

    确认有无英伟达显卡,有才能安装GPU版的pytorch,否则只能装CPU版 1.任务管理器->性能: 设备管理器->显示适配器,也可以: nvidia驱动安装地址(大部分电脑自带,不需要额 ...

  6. 从 p12 格式 SSL 证书解出 pem 格式公钥私钥给 Postman 使用

    目的 Postman 的(非 Chrome 扩展版的)app 并不能读取系统中的客户端证书,这种调试要发送客户端证书的 https 请求的时候就得自己另外设置.系统直接导出证书有 cer 和 p12 ...

  7. MyBatis日志模块源码分析

    MyBatis源码的logging包下是日志模块的相关实现,Mybatis日志模块通过适配器模式和代理模式优雅的实现了SQL日志的输出功能. 一. 适配器模式实现了MyBatis对第三方日志框架的适配 ...

  8. 人脸识别库 虹软 客户端 服务端 示例 基于虹软SDK在C/S 模式下的多人脸实时识别(C#)

    https://github.com/18628271760/MultipleFacesProcess 一.前言 虹软开发SDK以来,其免费使用的营销策略,成功降低了中小企业使用人脸识别技术的成本.然 ...

  9. 记录一次由nginx配置引发出来的一系列的缓存问题

    问题描述: 在做一个企业微信的移动端项目时,每次修改代码后并且打包.部署完毕,再次打开页面总是会有上一次的缓存,一开始以为是cookie和webStorage缓存导致的,然后每次清除还是有缓存,后来把 ...

  10. Linux下docker安装部署

    Linux下docker安装部署 环境说明 该文档安装环境为CentOS Linux release 7.9.2009,内核版本为3.10.0-1160.81.1.el7.x86_64 安装说明 安装 ...