使用无锁的方式和有锁的方式的程序性能对比

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java pgp_Java相当好的隐私(PGP)

java pgp公钥加密 这篇文章讨论了PGP或“很好的隐私”。 PGP是常规加密和公用密钥加密的混合实现。 在详细介绍PGP之前&#xff0c;让我们先谈谈公钥加密。 与其他任何加密技术一样&#xff0c;公钥加密解决了通过不安全介质传输安全数据的问题。 即互联网。 结果&#xff0c;…

extjs弹出窗口查看文本内容-new Ext.Window

代码样例&#xff1a; function processscan(){ var text时间 用户 操作<br> 时间 用户 操作<br> 时间 用户 操作; var win new Ext.Window({ layout: fit, width: 700, height: 600, closeAction: hide, dra…

MySql默认编码所造成的乱码麻烦1.222

1、前言 MySQL在安装时&#xff0c;最后的一步&#xff0c;会让你选择MySQL服务器及客户端、数据库、连接接口的默认编码。通常可选择 UTF8和GB2312. 但是&#xff0c;如果你选择了utf8的时候&#xff0c;恰好你要从另一个数据库上迁移一个gb2312编码格式的数据库过来&#xff…

jquery(js) 增加 删除 修改属性样式、元素内容

引入jquery.js 1.增加或修改样式 $(#id).css(display,none);--根据id设置隐藏 2.$("#id").css({"background-color":"yellow","font-size":"200%"}); 3.增加或修改属性 $(#id).attr(readonly,true);--根据id设置标签属性…

构建自动化面板

上周二&#xff0c;我作为持续讨论&#xff08;&#xff03;c9d9&#xff09;的一部分&#xff0c;参加了一个关于Build Automation主题的在线讨论会&#xff0c;这是一系列有关敏捷&#xff0c;持续交付和DevOps的社区讨论会。 自动化构建流程面临许多挑战&#xff0c;包括第三…

Ioc Autofac心得

对于这个容器注入&#xff0c;个人也不是很熟悉&#xff0c;很多还不懂&#xff0c;只会基本的操作&#xff0c;几天把它记录下来&#xff0c;说不定以后帮助就大了呢&#xff0c;这方面跟安卓差距还是挺大的 下面记录下应用的流程 步骤&#xff1a; 1.添加应用 2.重写工厂&…

开启关闭mysql日志

//mysql开启sql日志 SET GLOBAL log_output TABLE;SET GLOBAL general_log ON; //mysql关闭sql日志 SET GLOBAL log_output TABLE; SET GLOBAL general_log OFF; ---查询mysql运行过的sql SELECT * from mysql.general_log ORDER BY event_time DESC;

深入学习Web Service系列----异步开发模式

概述 在本篇随笔中&#xff0c;通过一些简单的示例来说一下Web Service中的异步调用模式。调用Web Service方法有两种方式&#xff0c;同步调用和异步调用。同步调用是程序继续执行前等候调用的完成&#xff0c;而异步调用在后台继续时&#xff0c;程序也继续执行&#xff0c;不…

java 实现excel样式设置(居中、字体、大小、换行、合并行,列宽、指定特定字符串样式等)

HSSFWorkbook workbook new HSSFWorkbook(); Sheet sheet workbook.createSheet(); sheet.setColumnWidth(0, 30*256);//设置当前sheet页第一列宽度 sheet.setColumnWidth(1, 70*256);//第二列宽度 CellStyle style workbook.createCellStyle(); Font font workbook.cre…

可选依赖项

有时您正在编写的库可能具有可选的依赖项。 例如“如果apache http客户端在类路径上&#xff0c;请使用它&#xff1b;否则&#xff0c;请使用它。 否则–退回到HttpURLConnection”。 为什么要这么做&#xff1f; 由于各种原因–在分发库时&#xff0c;您可能不想强加较大的依…

XML-RPC协议学习

XML-RPC调用包括2部分&#xff1a;客户端client&#xff08;调用线程&#xff09;、服务器端server&#xff08;被调用的线程&#xff09;。服务端是通过特定的URL获得的&#xff0c;调用过程如下&#xff1a; 1.客户端程序使用XML-RPC客户端发出作业请求&#xff0c;指定方法名…

extjs tree 遍历树节点并设置选中

function initTreeChecked(){//获取根节点 var rootnoe Ext.getCmp("id").getRootNode();; setAllNodes(rootnoe); } //遍历所有节点 function setAllNodes(node){ setNodeChecked(node);//设置选中 var nodesnode.childNodes; for(var i0;i<…

Android开发中调用系统窗口的方法

//直接拨号 Intent callIntent new Intent(Intent.ACTION_CALL,Uri.parse("tel:12345678")); startActivity(callIntent); //将电话号码传入拨号程序 Intent dialIntent new Intent(Intent.ACTION_DIAL,Uri.parse("tel:12345678")); startActivity(dial…

navicate导出导入表数据问题

1.导出导入json&#xff0c;如下图&#xff0c;右击表点击导出向导&#xff0c;选择json导出类型&#xff0c;根据提示导出即可。 导入时&#xff0c;右击接收的表&#xff0c;点击导入向导&#xff0c;根据提示即可快速导入&#xff08;注&#xff1a;不同系统之间导出导入易…

spring pojo_使用Spring将POJO公开为JMX MBean

spring pojo这是一个非常不错的教程&#xff0c;介绍了如何通过我们最新的JCG合作伙伴 “ The Holy Java ”博客&#xff08;很酷的名字&#xff09;实现“ 用Spring轻松将POJO作为JMX MBean公开 ”。 &#xff08;注意&#xff1a;对原始帖子进行了少量编辑以提高可读性&#…

android地图实时标记

问题描述我在用百度地图给上边做标注的时候&#xff0c;用了一下主要代码&#xff1a;class MyOverlayItem extends ItemizedOverlay<OverlayItem>{ private ArrayList<OverlayItem> mOverlayList new ArrayList<OverlayItem>();private double mLat1 34.0…

tongweb通过控制台简单设置确认相关常用参数

1.环境版本 jdk&#xff0c;tongweb版本确认是否正确 2.检查tongweb的 license是不是永久版本&#xff0c;试用期版本到期会停止服务。 3 JVM运行编码配置-根据系统需要配置 3.1-Dfile.encodingUTF-8 编码根据系统需要配置 4. tongweb运行内存大小--根据系统需要配置 4.1一般 …

编译原理--LL(1)分析法实验C++

一、实验项目要求 1.实验目的 根据某一文法编制调试LL&#xff08;1&#xff09;分析程序&#xff0c;以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析LL&#xff08;1&#xff09;分析法的理解。 2.实验要求 对下列文法&#xff0c;用LL&#xff08;…

实际中进行GC调整

调优垃圾回收与任何其他性能调优活动没有什么不同。 您需要确保了解当前的情况和期望的结果&#xff0c;而不是因为对应用程序的随机部分进行调整而产生了诱惑。 通常&#xff0c;只需执行以下过程即可&#xff1a; 陈述您的绩效目标 运行测试 测量 与目标比较 进行更改并…

达梦数据库出现卡慢简单分析点

1.检查是否有锁表 查询锁表&#xff1a;select sess_id,sql_text from v$sessions sess,v$lock lck where sess.trx_idlck.trx_id and lck.blocked1; --查询僵死会话 解锁&#xff1a;根据会话ID&#xff0c;停止会话 sp_close_session(sess_id); 2.根据v$sessions,V$L…