这里分别使用有锁和无锁两种方式,对一个数值进行增加,一直增加到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

使用无锁的方式和有锁的方式的程序性能对比相关推荐

  1. 12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁

    小陈:呼叫老王...... 老王:来了来了,小陈你准备好了吗?今天我们来讲synchronized的锁重入.锁优化.和锁升级的原理 小陈:早就准备好了,我现在都等不及了 老王:那就好,那我们废话不多说 ...

  2. 基于注解的方式实现分布式锁

    基于注解的方式实现分布式锁 关于分布式锁的实现由两种 基于redis 基于zookeeper 为了方便分布式锁的使用, 基于注解的方式抽取成公用组件 DisLock注解 /*** 分布式锁的注解, 通 ...

  3. 无锁队列的几种实现及其性能对比

    一.无锁队列用在什么样的场景? 当需要处理的数据非常多,比如行情数据,一秒处理非常多的数据的时候,可以考虑用无锁队列.但是如果一秒只需要处理几百或者几千的数据,是没有必要考虑用无锁队列的.用互斥锁就能 ...

  4. **Java有哪些悲观锁的实现_Redis 分布式锁的正确实现方式(Java版)

    前言 分布式锁一般有三种实现方式: 数据库乐观锁: 基于Redis的分布式锁: 基于ZooKeeper的分布式锁 本篇博客将介绍第二种方式,基于Redis实现分布式锁. 虽然网上已经有各种介绍Redi ...

  5. 三种方式实现分布式锁

    方案一:数据库乐观锁 乐观锁通常实现基于数据版本(version)的记录机制实现的,比如有一张红包表(t_bonus),有一个字段(left_count)记录礼物的剩余个数,用户每领取一个奖品,对应的 ...

  6. 分布式锁简单入门以及三种实现方式介绍(滴滴)

    很多小伙伴在学习Java的时候,总是感觉Java多线程在实际的业务中很少使用,以至于不会花太多的时间去学习,技术债不断累积!等到了一定程度的时候对于与Java多线程相关的东西就很难理解,今天需要探讨的 ...

  7. 分布式锁的三种实现方式_分布式锁的几种实现方式~

    目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CAP理论告诉我们"任何一个分布式系统都无法同时满足一致性(Consistency) ...

  8. 分布式锁的三种实现方式_分布式锁的多种实现方式

    目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CAP理论告诉我们"任何一个分布式系统都无法同时满足一致性(Consistency) ...

  9. 线程控制、如何给面试官描述线程不安全的情况?模拟黄牛抢票展现不安全的情况及解决方式、互斥锁加锁解锁

    多线程1 线程概念 线程控制 线程创建 线程终止 线程等待 线程分离 线程安全 如何给面试官描述线程不安全的现象? 线程不安全的情况(模拟黄牛抢票) 互斥 互斥锁的原理 互斥锁的接口 静态初始化 动态 ...

最新文章

  1. nodejs-EventEmitter
  2. 深圳华强电子交易网络有限公司3.15大会再获大奖
  3. linux 内核升级 网络 不能上网,Deepin Linux 无法上网
  4. 企业级UML/MDA工具Trufun 2007系列发布!
  5. linux usb视频开发板,ARM开发板上USB 摄像头图像采集实现
  6. 重载赋值运算符含动态申请
  7. jsp中为什么在跳转500页面的时候 图片加载不出来
  8. 信息学奥赛一本通(1217:棋盘问题)
  9. 洛谷——P1311 选择客栈
  10. 搭建开发环境tomcat起不来
  11. MySQL.Linux.安装
  12. 美国发布新的安全备忘录,提升关键基础设施的网络安全
  13. 你以为我在玩游戏?其实我在学 Java
  14. SqlServer2012下载和安装(资源自带密钥)
  15. Windows安装numpy详细教程
  16. springboot基于Javaweb的超市管理系统毕业设计源码281024
  17. 产品生命周期管理PLM系统概述——睿思成研发管理咨询(www.wiserdm.com)
  18. 微吼林彦廷:当直播成为一门显学
  19. java收octet-stream后转multipart方案
  20. vue标签旋转_基于vue下input实现图片上传,压缩,拼接以及旋转的代码详解

热门文章

  1. maya室内模型_C4d和3dmax、maya相比有什么优势?
  2. 如何导出久其报表所有数据_如何选择好的HR软件
  3. 常用于单片机的接口适配器模式C语言实现
  4. java广度优先爬虫示例,【爬虫】广度优先遍历抓取数据概述
  5. ln函数怎么看奇偶性_Python中函数的参数应该怎么理解?看完这篇文章情不自禁的想收藏...
  6. php 多图上传编辑器,ThinkPHP5整合LayUI编辑器图片上传
  7. mysql该账户已存在_mysql 查看函数的所属用户和已存在的函数
  8. 鲸鱼优化算法_盘点 35 个 Java 代码优化细节
  9. 【渝粤教育】国家开放大学2019年春季 1062文学英语赏析 参考试题
  10. [渝粤教育] 中国地质大学 职业健康管理体系 复习题 (2)