java并发编程 性能与可伸缩性_Java并发编程实战 第11章 性能与可伸缩性

news/2024/7/16 7:00:49

关于性能

性能的衡量标准有很多,如:

服务时间,等待时间用来衡量程序的"运行速度""多快"。

吞吐量,生产量用于衡量程序的"处理能力",能够完成"多少"工作。

多快和多少有时候是互相矛盾的。

关于可伸缩性

可伸缩性:当增加计算资源(CPU 内存 存储 带宽)时,程序的吞吐量或者处理能力能够相应的增加。

评估各种性能权衡的因素

各种性能指标之间权衡,需要考虑的是系统需求和使用场景。

例如,快速排序算法在处理大规模数据集上的执行效率较高,但是小规模数据可能更加适合冒泡排序。

Amdahl定律

定义:在无限增加计算资源的情况下,理论上系统能够达到性能提升比率(最高加速比),局限于程序中可并行组件与串行组件所占的比重。

具体的公式就不列出来了,举个例子,如果系统中必须串行的部分占比为1/2,那么即使你把系统的CPU无限加大,最高也只能达到2倍的加速。如果系统中必须串行的部分占比为1/10,那么即使你把系统的CPU无限加大,最高也只能达到10倍的加速。

Amdahl告诉我们,并不是无限的加大CPU就能够提高性能的。

引入线程的开销

上下文切换

如果在运行的线程数大于CPU数目,那么一个线程的时间片结束,或者被阻塞,将它调出,把时间片交给另外一个线程。就会引起上下文切换。

因为上下文切换带来的负载,操作系统调度器会为每个线程分配一个最小执行时间(如果分配的执行时间还没有上下文切换的时间多,那么岂不是时间都浪费在上下文切换上了)。

一个线程发生阻塞,会放弃它的时间片。所以频繁阻塞会引起过多的上下文切换。

上下文切换就是保存一个线程的状态,加载下一个线程的状态。

内存同步

synchronize和volatile带来的可视性保证可能会使用一些特殊指令,如内存栅栏,它可以刷新缓存,使缓存无效,刷新硬件的写缓存,以及停止执行管道,抑制编译器优化,如重排序。

阻塞

JVM在实现阻塞的时候,有两种方式:

自旋等待,不断地轮询trylock。适用于阻塞时间较短的情况。

使用操作系统挂起线程。适用于阻塞时间较长的情况。

减少锁的竞争

串行操作可以降低可伸缩性。在并行操作内部,可伸缩性最大的威胁就是锁的竞争。

有两个因素可以影响锁的竞争:

请求频率。

锁定时间

如果两者都很小,那么在锁上发生竞争的机会就比较少。

有3中方式可以减少锁的竞争。

锁定时间层面,快进快出

做法就是分解拆分过长的同步代码块。

降低线程请求锁的频率

做法就是锁分解和锁分段。跟上面不一样,上面是分解同步代码块。

锁分解:如果一个锁维护了多个相互独立的状态变量。那么可以使用多个锁来维护每个独立的状态变量。

锁分段:使用锁分解技术进一步的将一组数据拆分,然后在拆分后的数据上建立多个锁。

锁分段的案例:

ConcurrentHashMap默认使用包含16个锁的数组,每个锁保护散列通的1/16。

不使用独占锁

如使用并发容器,读写锁,不可变对象,原子变量等。

Java并发编程实战---第六章:任务执行

废话开篇 今天开始学习Java并发编程实战,很多大牛都推荐,所以为了能在并发编程的道路上留下点书本上的知识,所以也就有了这篇博文.今天主要学习的是任务执行章节,主要讲了任务执行定义.Executor. ...

Java并发编程实战 第16章 Java内存模型

什么是内存模型 JMM(Java内存模型)规定了JVM必须遵循一组最小保证,这组保证规定了对变量的写入操作在何时将对其他线程可见. JMM为程序中所有的操作定义了一个偏序关系,称为Happens-Be ...

【java并发编程实战】第一章笔记

1.线程安全的定义 当多个线程访问某个类时,不管允许环境采用何种调度方式或者这些线程如何交替执行,这个类都能表现出正确的行为 如果一个类既不包含任何域,也不包含任何对其他类中域的引用.则它一定是无状态 ...

Java并发编程实战 第8章 线程池的使用

合理的控制线程池的大小: 下面内容来自网络.不过跟作者说的一致.不想自己敲了.留个记录. 要想合理的配置线程池的大小,首先得分析任务的特性,可以从以下几个角度分析: 任务的性质:CPU密集型任务.IO ...

Java并发编程实战 第3章 对象的共享

可见性 可见性是由于java对于多线程处理的内存模型导致的.这似乎是一种失败的设计,但是JVM却能充分的利用多核处理器的强大性能,例如在缺乏同步的情况下,Java内存模型允许编译器对操作顺序进行重排序 ...

java并发编程实战:第二章----线程安全性

一个对象是否需要是线程安全的取决于它是否被多个线程访问. 当多个线程访问同一个可变状态量时如果没有使用正确的同步规则,就有可能出错.解决办法: 不在线程之间共享该变量 将状态变量修改为不可变的 在访问 ...

Java并发编程实战 第15章 原子变量和非阻塞同步机制

非阻塞的同步机制 简单的说,那就是又要实现同步,又不使用锁. 与基于锁的方案相比,非阻塞算法的实现要麻烦的多,但是它的可伸缩性和活跃性上拥有巨大的优势. 实现非阻塞算法的常见方法就是使用volatil ...

Java并发编程实战 第10章 避免活跃性危险

死锁 经典的死锁:哲学家进餐问题.5个哲学家 5个筷子 如果没有哲学家都占了一个筷子 互相等待筷子 陷入死锁 数据库设计系统中一般有死锁检测,通过在表示等待关系的有向图中搜索循环来实现. JVM没有死 ...

Java并发编程实战 第5章 构建基础模块

同步容器类 Vector和HashTable和Collections.synchronizedXXX 都是使用监视器模式实现的. 暂且不考虑性能问题,使用同步容器类要注意: 只能保证单个操作的同步. ...

随机推荐

xml与datatable类型互换

//已测 private DataTable ConvertXMLToDataSet(string xmlData) { StringReader stream = null; XmlTextRead ...

iOS中获取各种文件的目录路径的方法

我们的app在手机中存放的路径是:/var/mobile/Applications/4434-4453A-B453-4ADF535345ADAF344 后面的目录4434-4453A-B453-4AD ...

js 中使用el表达式 关键总结:在js中使用el表达式一定要使用双引号

js 中使用el表达式 关键总结:在js中使用el表达式一定要加双引号 js控制中用到了el表达式,最开始源码如下: var selected = ${requestScope.xxxxForm.re ...

iOS开发中乱用hook可能导致灾难

今天有同事遇到问题,他重写viewDidAppear:方法,但是,代码并没有执行到.后来我发现,是另个一同事用了黑魔法搞的鬼,而且他本人并不知道这么做会产生影响.(本文中所有黑魔法指Swizzle) ...

javascript 内置对象

什么是对象 javascript中的所有事物都是对象:字符串  数组  数值  函数... 每个对象都带有属性和方法 javascript允许自定义对象      自定义对象: 定义并创建对象实例 使 ...

COJ 0801 非传统题(一)

非传统题(一) 难度级别:A: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 大家好!我是COJ第一道非传统题,是不是感觉非常的excite ...

LDAP协议

很多人虽然会使用dsadd等命令添加用户,但是dsadd的命令说明里面并没有涉及到dc,cn,ou的含义,很多人都不明白,这里是微软的技术支持人 员的回信,希望对大家有帮助. CN, OU, DC 都 ...

CSS3秘笈:第一章

1.

和 标签:
和 标签:就像是一个空的容器,我们要往里面填充内容.一个div就是一个块,意味着它的前后都要空一 ...

励研(LY) CRC16算法

/**************************************************** ** 函数名称: CalculateCRC16 ** 输 入: buf 要校验的数据; le ...

关于awk的多文件处理

关于awk的多文件处理: awk的数据输入有两个来源,标准输入和文件,后一种方式支持多个文件,如1.shell的Pathname Expansion方式:awk '{...}' *.txt # *.t ...


http://www.niftyadmin.cn/n/3573267.html

相关文章

计算机无法共享没有启动不,windows共享文件时右键不出现共享没有共享的选项...

windows右键不出现共享的解决方法问题现象:当我们想在window2003下共享文件时,发现右击文件夹,并没有“共享”的选项解决步骤:首先验证:A.是否administrator身份登录本地连接属性,B.“文件打印机共享”的服…

java annoataion_Java 注解(Annoation)学习笔记

1 Junit中的Test为例:1.1 用注解(Test)前private booleanisTestMethod(Method m) {returnm.getParameterTypes().length 0 &&m.getName().startsWith("test") &&m.getReturnType().equals(Void.TYPE);}用注解前(Junit4之前),J…

书山有径——走进清华大学图书馆

在你的印象中,图书馆应该是什么样子的?很多人的脑海中还闪现着书架、借书、还书等这样的传统场景。实际上,随着信息技术的发展,互联网成为知识传播的一个重要载体,图书馆的服务远不止传统的借还书业务,而是充分利用网…

LeetCode 36、有效的数独

36、有效的数独 1)题目描述 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。…

php基础控制器类_基础控制器 · ThinkPHP6.0完全开发手册 · 看云

大多数情况下,我们建议给你的控制器继承一个基础控制器。默认安装后,系统提供了一个app\BaseController基础控制器类,你可以对该基础控制器进行修改。>[danger] 基础控制器的位置可以随意放置,只需要注意更改命名空间即可。该基…

java swt 输入框_关于java swt的问题 点击按钮,弹出一个带Text的对话框,输入一个字符串,然后关闭对话框,同时保存字符串...

因为之后要对保存的字符串做一些操作,要暂时停止后面代码的执行,但是不知道该怎么停止。。。button1.addSelectionListener(neworg.eclipse.swt.events.SelectionAdapter(){publicvo...因为之后要对保存的字符串做一些操作,要暂时停止后面代码…

北京邮电大学计算机考研拟录取名单,北京邮电大学研究生拟录取名单2021公示...

关于公布2021年统考硕士研究生拟录取名单的通知根据教育部、北京市相关文件要求,经我校研究生招生委员会审核,现将我校2021年统考硕士研究生拟录取名单予以公示,公示期为10天(4月24日-5月3日)。公示期内如有异议,请与研究生招生办…

jquery 获取input的值

为什么80%的码农都做不了架构师&#xff1f;>>> //jquery获取input值 <a href"javascript:history.back(-1);">返回</a> <input class"btn btn6" onclick"history.go(-1)" value"返回" type"button&q…