使用无锁的方式和有锁的方式的程序性能对比
这里分别使用有锁和无锁两种方式,对一个数值进行增加,一直增加到100000,然后输出使用时间的长短。
1 import java.util.concurrent.ExecutorService; 2 import java.util.concurrent.Executors; 3 import java.util.concurrent.TimeUnit; 4 import java.util.concurrent.atomic.AtomicInteger; 5 6 public class TestAtomic { 7 8 // 设置线程数量 9 private static int N = 1000; 10 // 设置最大值 11 private static int M = 1000000; 12 13 /** 14 * 无锁方法 15 * 16 * @throws InterruptedException 17 */ 18 private static void atomicMethod() throws InterruptedException { 19 AtomicRun atomicRun = new AtomicRun(); 20 AtomicRun.endValue = M; 21 22 ExecutorService service = Executors.newFixedThreadPool(N); 23 // 开始时间 24 long starttime = System.currentTimeMillis(); 25 for (int i = 0; i < N; i++) { 26 service.submit(atomicRun); 27 } 28 service.shutdown(); 29 service.awaitTermination(Integer.MAX_VALUE, TimeUnit.MILLISECONDS); 30 // 结束时间 31 long endTime = System.currentTimeMillis(); 32 System.out.println("无锁线程数量为 : " + N + " 开始时间为 : " + starttime 33 + " 结束时间为 : " + endTime + " 耗费时间为 : " + (endTime - starttime) 34 + "ms" + " value:" + AtomicRun.atomicInteger); 35 } 36 37 /** 38 * 加锁方法 39 * 40 * @throws InterruptedException 41 */ 42 private static void synMethod() throws InterruptedException { 43 SynRun synRun = new SynRun(); 44 SynRun.endValue = M; 45 46 ExecutorService service = Executors.newFixedThreadPool(N); 47 long starttime = System.currentTimeMillis(); 48 for (int i = 0; i < N; i++) { 49 service.submit(synRun); 50 } 51 service.shutdown(); 52 service.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS); 53 long endTime = System.currentTimeMillis(); 54 System.out.println("有锁线程数量为 : " + N + " 开始时间为 : " + starttime 55 + " 结束时间为 : " + endTime + " 耗费时间为 : " + (endTime - starttime) 56 + "ms" + " value:" + AtomicRun.atomicInteger); 57 } 58 59 public static void main(String[] args) throws InterruptedException { 60 System.out.println("当线程数量为 : " + N + "时:"); 61 atomicMethod(); 62 synMethod(); 63 } 64 } 65 66 /** 67 * 68 * @author 秦孔祥 69 * 70 */ 71 class AtomicRun implements Runnable { 72 73 protected static AtomicInteger atomicInteger = new AtomicInteger(); 74 protected static int endValue; 75 76 @Override 77 public void run() { 78 int startValue = atomicInteger.get(); 79 while (startValue < endValue) { 80 startValue = atomicInteger.incrementAndGet(); 81 } 82 } 83 } 84 85 class SynRun implements Runnable { 86 87 protected static int startValue; 88 protected static int endValue; 89 90 @Override 91 public void run() { 92 while (startValue < endValue) { 93 addValue(); 94 } 95 } 96 97 private synchronized void addValue() { 98 startValue++; 99 } 100 }
转载于:https://www.cnblogs.com/Cilimer/p/4021210.html
使用无锁的方式和有锁的方式的程序性能对比相关推荐
- 12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁
小陈:呼叫老王...... 老王:来了来了,小陈你准备好了吗?今天我们来讲synchronized的锁重入.锁优化.和锁升级的原理 小陈:早就准备好了,我现在都等不及了 老王:那就好,那我们废话不多说 ...
- 基于注解的方式实现分布式锁
基于注解的方式实现分布式锁 关于分布式锁的实现由两种 基于redis 基于zookeeper 为了方便分布式锁的使用, 基于注解的方式抽取成公用组件 DisLock注解 /*** 分布式锁的注解, 通 ...
- 无锁队列的几种实现及其性能对比
一.无锁队列用在什么样的场景? 当需要处理的数据非常多,比如行情数据,一秒处理非常多的数据的时候,可以考虑用无锁队列.但是如果一秒只需要处理几百或者几千的数据,是没有必要考虑用无锁队列的.用互斥锁就能 ...
- **Java有哪些悲观锁的实现_Redis 分布式锁的正确实现方式(Java版)
前言 分布式锁一般有三种实现方式: 数据库乐观锁: 基于Redis的分布式锁: 基于ZooKeeper的分布式锁 本篇博客将介绍第二种方式,基于Redis实现分布式锁. 虽然网上已经有各种介绍Redi ...
- 三种方式实现分布式锁
方案一:数据库乐观锁 乐观锁通常实现基于数据版本(version)的记录机制实现的,比如有一张红包表(t_bonus),有一个字段(left_count)记录礼物的剩余个数,用户每领取一个奖品,对应的 ...
- 分布式锁简单入门以及三种实现方式介绍(滴滴)
很多小伙伴在学习Java的时候,总是感觉Java多线程在实际的业务中很少使用,以至于不会花太多的时间去学习,技术债不断累积!等到了一定程度的时候对于与Java多线程相关的东西就很难理解,今天需要探讨的 ...
- 分布式锁的三种实现方式_分布式锁的几种实现方式~
目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CAP理论告诉我们"任何一个分布式系统都无法同时满足一致性(Consistency) ...
- 分布式锁的三种实现方式_分布式锁的多种实现方式
目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CAP理论告诉我们"任何一个分布式系统都无法同时满足一致性(Consistency) ...
- 线程控制、如何给面试官描述线程不安全的情况?模拟黄牛抢票展现不安全的情况及解决方式、互斥锁加锁解锁
多线程1 线程概念 线程控制 线程创建 线程终止 线程等待 线程分离 线程安全 如何给面试官描述线程不安全的现象? 线程不安全的情况(模拟黄牛抢票) 互斥 互斥锁的原理 互斥锁的接口 静态初始化 动态 ...
最新文章
- nodejs-EventEmitter
- 深圳华强电子交易网络有限公司3.15大会再获大奖
- linux 内核升级 网络 不能上网,Deepin Linux 无法上网
- 企业级UML/MDA工具Trufun 2007系列发布!
- linux usb视频开发板,ARM开发板上USB 摄像头图像采集实现
- 重载赋值运算符含动态申请
- jsp中为什么在跳转500页面的时候 图片加载不出来
- 信息学奥赛一本通(1217:棋盘问题)
- 洛谷——P1311 选择客栈
- 搭建开发环境tomcat起不来
- MySQL.Linux.安装
- 美国发布新的安全备忘录,提升关键基础设施的网络安全
- 你以为我在玩游戏?其实我在学 Java
- SqlServer2012下载和安装(资源自带密钥)
- Windows安装numpy详细教程
- springboot基于Javaweb的超市管理系统毕业设计源码281024
- 产品生命周期管理PLM系统概述——睿思成研发管理咨询(www.wiserdm.com)
- 微吼林彦廷:当直播成为一门显学
- java收octet-stream后转multipart方案
- vue标签旋转_基于vue下input实现图片上传,压缩,拼接以及旋转的代码详解
热门文章
- maya室内模型_C4d和3dmax、maya相比有什么优势?
- 如何导出久其报表所有数据_如何选择好的HR软件
- 常用于单片机的接口适配器模式C语言实现
- java广度优先爬虫示例,【爬虫】广度优先遍历抓取数据概述
- ln函数怎么看奇偶性_Python中函数的参数应该怎么理解?看完这篇文章情不自禁的想收藏...
- php 多图上传编辑器,ThinkPHP5整合LayUI编辑器图片上传
- mysql该账户已存在_mysql 查看函数的所属用户和已存在的函数
- 鲸鱼优化算法_盘点 35 个 Java 代码优化细节
- 【渝粤教育】国家开放大学2019年春季 1062文学英语赏析 参考试题
- [渝粤教育] 中国地质大学 职业健康管理体系 复习题 (2)