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

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. SQL中常用的字符串REPLACE函数和LEN函数详解!

    首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...

  2. cesium教程7-官方示例翻译-模型要素选择

    源代码示例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  3. html布局浅谈

    现在布局方式主要分为三种 传统css布局方案(position,float,line-height等配合).实现复杂,需要多种属性配合使用,兼容性最好. flex布局方案.弹性布局,实现方便,兼容性较 ...

  4. Windows 10 开启秒钟显示

    开始搜索运行 注册表管理器 regedit 定位路径到 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Adv ...

  5. grpc使用nginx代理配置

    参考:https://www.nginx.com/blog/nginx-1-13-10-grpc/ 重点是标记红色的部分 http { log_format main '$remote_addr - ...

  6. 食道测压结合Manoview软件

    我认为是位于食道开始的地方是上食道括约肌(UES):upper esophageal sphincte,吞咽时,此处的压力会有变大.食道结束的地方是食道下括约肌(LES),从这在往下就是胃,一般情况这 ...

  7. go append的坑

    b := []int{1,2,3,4,5} slice := b[:2] newSlice := append(slice, 50) fmt.Println(b) fmt.Println(newSli ...

  8. Docker 启动 Redis 就停止解决方案(2022-3)

    启动命令如下: docker run -itd \ -p 6379:6379 \ --name myredis \ -v /home/redis/redis.conf:/etc/redis/redis ...

  9. 计算巢AppFlow-如何在钉钉群实现智能答疑

    随着大模型能力越来越强大,利用大语言模型进行智能答疑已经成为了一个非常普遍和常见的场景.然而,各个产品或业务方要能够准确有效地进行答疑,仅依靠大模型的通用能力是远远不够的,这时候利用私有领域FAQ文档 ...

  10. iOS直播助手第一个版本总结

    经过1个月的努力,终于完成了直播助手iOS11版本的适配,第一个版本也已经提审,趁着这个空档进行一下总结: 打算后续按照目录进行完善 1.iOS直播采集介绍,直播助手iOS11采集使用的方法 2.iO ...