在java中,使用了synchronized关http://www.cppcns.com键字和Lock锁实现了资源的并发访问控制,在同一时间只允许唯一了线程进入临界区访问资源(读锁除外),这样子控制的主要目的是为了解决多个线程并发同一资源造成的数据不一致的问题。在另外一种场景下,一个资源有多个副本可供同时使用,比如打印机房有多个打印机、厕所有多个坑可供同时使用,这种情况下,Java提供了另外的并发访问控制--资源的多副本的并发访问控制,今天使用的Semaphore即是其中的一种。

Java通过代码模拟高并发可以以最快的方式发现我们系统中潜在的线程安全性问题,此处使用Semaphore(信号量)和 Count

1、Semaphore

JDK 1.5之后会提供这个类

Semaphore是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做完自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞。Semaphore可以用来构建一些对象池,资源池之类的,比如数据库连接池,我们也可以创建计数为1的Semaphore,将其作为一种类似互斥锁的机制,这也叫二元信号量,表示两种互斥状态。

2、CountDownLatch

JDK 1.5之后会提供这个类,

CountDownLhttp://www.cppcns.comatch这个类能够使一个线程等待其他线程完成各自的工作后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行。

CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。

如下图:

以上两个类可以搭配使用,达到模拟高并发的效果,以下使用代码的形式进行举例:

package modules;

import java.util.concurrent.CountDownLatch;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Semaph

如上方法模拟5000次请求,同时最大200个并发操作,观察最后的结果,发现每次的结果都有差别,和预期不符,得出结果部分如下:

22:18:26.449 [main] INFO modules.CountExample - count:4997

22:18:26.449 [main] INFO modules.CountExample - count:5000

22:18:26.449 [main] INFO modules.CountExample - count:4995

22:18:26.449 [main] INFO modules.CountExample - count:4998

最后结论:add 方法 非线程安全

那如何保证add方法 线程安全,将add方法进行如下修改即可:

private static void add() {

count.incrementAndGet();

}

执行结果如下:

22:18:26.449 [main] INFO modules.CountExample - count:5000

22:18:26.449 [main] INFO modules.CountExample - count:5000

22:18:26.449 [main] INFO modules.CountExample - count:5000

22:18:26.449 [main] INFO modules.CountExample - count:5000

22:18:26.449 [main] INFO modules.CountExample - count:5000

22:18:26.449 [main] INFO modules.CountExample - count:5000

22:18:26.449 [main] INFO modules.CountExample - count:5000

22:18:26.449 [main] INFO modules.CountExample - count:5000

最后结论:修改后 的  add 方yoqbbACyUP法 线程安全

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

本文标题: Java使用代码模拟高并发操作的示例

本文地址: http://www.cppcns.com/ruanjian/java/227029.html

java高并发代码示例,Java使用代码模拟高并发操作的示例相关推荐

  1. python并发循环_在Python中模拟一个并发循环?

    在Python中模拟一个并发循环? 我需要模拟Python程序中的并发循环.不幸的是,以下简单的代码不起作用:list_of_ints = [ 1, 2, 3 ]iterator = list_of_ ...

  2. 编写高质量代码:改善Java程序的151个建议(第9章:多线程和并发___建议125~131)

    建议125:优先选择线程池 建议126:适时选择不同的线程池来实现 建议127:lock与synchronized是不一样的 建议128:预防线程死锁 建议129:适当设置阻塞队列的长度 建议130: ...

  3. java雪崩_【并发编程】java 如何解决redis缓存穿透、缓存雪崩(高性能示例代码)...

    [并发编程]java 如何解决redis缓存穿透.缓存雪崩(高性能示例代码) 发布时间:2018-11-22 16:48, 浏览次数:872 , 标签: java redis <>缓存穿透 ...

  4. java 151建议_编写高质量代码改善java程序的151个建议——导航开篇

    前言 系列文章: 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,惨不忍睹是吧.确实,人和代码一样都在成长,都在变好当中.有时候只是实现功能的编程,长 ...

  5. java语言实现一个长度为n_Java语言实现求解一元n次多项式的方法示例[Java代码]...

    本文主要向大家介绍了Java语言实现求解一元n次多项式的方法示例,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 项目需要做趋势预测,采用线性拟合.2阶曲线拟合和指数拟合的算法,各种线 ...

  6. Github即将破百万的PDF:编写高质量代码改善JAVA程序的151个建议

    代码是我们前进的基石. 废话不多说直接把本书部分内容展示出来 目录 == 第1章Java开发中通用的方法和准则/1 建议1:不要在常量和变量中出现易混淆的字母/2 建议2:莫让常量蜕变成变量12 建议 ...

  7. JAVA三维可视化组件:Matplot 3D for JAVA(V3.0) 一个纯JAVA开发的科学数据可视化组件包 类似 Python 的matplotlib(含示例代码)

    目录 概述 组件下载及项目地址 效果展示和示例代码 概述 Matplot3D for JAVA(V3.0) 是一个基于JAVA SE 1.8环境开发的三维图形图表组件. 组件由纯JAVA SE 实现( ...

  8. java中普通代码块,构造代码块,静态代码块的区别及代码示例

    本文转自:http://www.cnblogs.com/sophine/p/3531282.html 执行顺序:(优先级从高到低)静态代码块>main方法>构造代码块>构造方法. 其 ...

  9. 死锁是什么?死锁产生的条件?如何避免死锁?以及死锁的示例代码(Java代码)

    文章目录 一.什么是死锁? 二.产生死锁的条件? 三.产生死锁的示例代码(java) 四.如何避免死锁? 一.什么是死锁? 下面图片参考 JavaGuide中的内容: 死锁的概念: 死锁:指的是相互两 ...

  10. 编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议1~5)...

                 The reasonable man adapts himself to the world; The unreasonable one persists in trying ...

最新文章

  1. Python 知识点笔记一常用数据类型
  2. WIN32 Inline HOOK
  3. python实现一种检测postgresql数据库是否已经连接且为主节点的办法
  4. php编程怎么和mysql链接_php编程怎么和mysql连接
  5. Spring的REST分页
  6. 正睿2019省选附加赛 Day10 (这篇其实已经都咕咕了...)
  7. ecshop 收货人信息电话必填改为手机必填
  8. maven 指定jdk版本打包
  9. 莫比乌斯反演习题总结
  10. R-CNN学习笔记2:Rich feature hierarchies for accurate object detection and semantic segmentation
  11. 大学计算机思维导论第七讲答案,中国大学MOOC计算思维导论网课答案
  12. 圣诞节,教你用Python给微信头像添加一个圣诞帽
  13. 2015年3月CCF软考试题
  14. 本轮大宗商品涨价:(背后原因分析)2021-09
  15. windows系统服务器怎么锁屏,电脑怎么锁屏?锁屏快捷键是什么?
  16. JavaScript jQuery遍历对象each()方法
  17. 理解matplotlib、pylab与pyplot之间的关系
  18. not exists 中from 后面不同写法带来的效率区别
  19. LeetCode每日一题:927. 三等分 (困难) 数组 数学
  20. 7.21高峰奖励政策--滴滴快车

热门文章

  1. Java基础:MySQL
  2. java-Aspose.Words的使用(Office文档转为PDF)
  3. LMM(LightMoonMovie)亮月湾电影分享管理系统;
  4. 根据已有的WSDL文件进行WebService服务开发和部署
  5. android设备调用usb外置摄像头方法及案例
  6. opencv程序在未安装opencv环境下运行方法总结
  7. ​观点|我离开AI行业的5个理由
  8. Zabbix监控配置
  9. bzoj 4883 [Lydsy1705月赛]棋盘上的守卫——并查集(思路!)
  10. eclipse的使用技巧