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

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. 11.17~11.18暨noip2023游寄

    11.17 我们DZ不负众望又干了点nt事,但是为了按时间顺序记叙,所以说放到最后再讲 上午 平常的起床+吃饭,然后就发手机啥的,坐大巴去德州东再坐会高铁去秦皇岛,这些简单记一下就行了 重点来了 先拜 ...

  2. 简说Python之flask初体验

    目录 flask初体验 1.安装Flask 2.创建"Hello, World" Flask应用 3.执行结果 flask是python web的轻量框架,简单的几条命令就可以创建 ...

  3. code::blocks更改编译器配置

  4. 04 Xpath_[实例]爬取maoyan

    目录 Xpath lxml库的安装和使用 提取的内容 代码 生成的csv 下载的图片 参考文档 Xpath lxml库的安装和使用 提取的内容 随意选取的一段 节点包含的影片信息,如下所示: < ...

  5. 小程序 image 高度自适应及裁剪问题

    在做微信小程序的商品详情页,商品的详情是图片集合,渲染完成后发现图片加载的很不自然,后来我把样式设置宽度 100%,并对 image 组件添加属性 mode="widthFix"解 ...

  6. mybatis-plus id在高并发下出现重复

    mybaits-plus ASSIGN_ID生成 id生成策略 在分布式高并发环境下出现重复id https://github.com/baomidou/mybatis-plus/issues/307 ...

  7. Kmesh进入CNCF云原生全景图,实现网格治理sidecarless化

    本文分享自华为云社区<Kmesh进入CNCF 云原生全景图> ,作者:云容器大未来. 近日,Kmesh 正式进入 CNCF 云原生全景图,位于 Service Mesh 类别下. CNCF ...

  8. skipped: maximum number of running instances reached (1)

    apscheduler定时任务报错skipped: maximum number of running instances reached (1) 原因是默认max_instances最大定时任务是1 ...

  9. 开发中你不得不知的一个Git小技巧

    一. 背景 在工作中大家应会碰到需要频繁在两个分支中切换工作的情况,我们通常做法是利用git stash命令暂存当前工作区中的变更,然后git checkout到目标分支中工作,工作完成后回到刚刚分支 ...

  10. OpenVSCode云端IDE加入Rainbond一体化开发体系

    OpenVSCode 是一款基于Web 界面的在线IDE 代码编辑器,只需要PC端存在浏览器即可使用,更轻量,高效,简洁,其基础功能完全继承了微软出品的 VS Code ,可以通过安装扩展的方式继续加 ...