java并发编程实践(1)intro

【0】README
0.1)本文部分文字描述转自“java并发编程实践”,旨在学习“java并发编程实践(1)intro”的相关知识;

【3】线程带来的风险
【3.1】安全性问题
1)intro:在没有充足同步的case下,多个线程的操作执行顺序是不可预测的;
2)看个荔枝:
public class UnsafeSequence
{private int value;public int getNext(){return value++;}
}
对以上代码的分析(Analysis):上述类的问题在于:如果执行时机不对,那么两个线程在调用 getNext方法时会得到相同的值;如下图所示:

对上图的分析(Analysis):
A1)虽然递增运算 value++ 看上去是单个操作,但事实上它包含3个独立的操作:读取value,将value加1,并将计算结果写入value;由于运行时可能将多个线程之间的操作交替执行,因此这两个线程可能同时执行读操作,从而使得他们得到相同的值,并都将这个值加1.结果就是,在不同线程的调用中返回了相同的数值;
A2)上面的交替执行示意图给出的是最糟糕的执行case:目的是为了说明,如果错误地假设程序中的操作将按照某种特定顺序来执行,那么会存在各种可能的危险;
A3)在UnsafeSequence类中说明的是一种常见的并发安全问题,称为竞态条件;因为在刚刚的荔枝中,getValue()方法是否返回唯一值,要取决于运行时对线程中操作的交替执行方式,这并不是我们希望看到的case;(干货——引入竞态条件)

3)由于多个线程要共享相同的内存地址空间,并且是并发运行,因此它们可能会访问或修改其他线程正在使用的变量;
4)当多个线程同时访问和修改相同变量时,将会在串行编程模型中引入非串行因素,而这种非串行性是很难分析的。要使多线程程序的行为可以预测,必须对共享变量的访问操作进行协同,这样才不会在线程之间发生彼此干扰。幸运的是,java 提供了各种同步机制来协同这种访问;(干货——引入对共享变量的协同访问操作)
看个荔枝)线程安全的数值序列生成器
public class SafeSequence {private int value;public synchronized int getNext(){return value++;}
}
【3.2】活跃性问题
1)定义:某件正确的事情最终会发生;
2)安全性的含义是:永远不发生最糟糕的事情,而活跃性则关注与另一个目标,即“某件正确的事情最终会发生”
3)当某个操作无法继续执行下去时,就会发生活跃性问题。在串行程序中,活跃性问题的形式之一是无意中造成的无限循环,从而使得循环之后的代码无法得到执行。
4)线程将带来一些其他活跃性问题:如,如果线程A在等待线程B 释放其特有的资源,而线程B永远都不释放该资源,那么A 就会永久地等待下去;

【3.3】性能问题
1)intro:希望正确的事情尽快发生,讲究的是效率;
2)性能问题包括多个方面:如服务时间过长,响应不灵敏,吞吐率过低,资源消耗过高,或者可伸缩性较低等;
3)线程总会带来某种程度的运行时开销:在多线程程序中,当线程调度器临时挂起活跃线程并转而运行另一个线程时,就会频繁地出现上下文切换操作,这种操作将带来极大的开销,保存和回复执行上下文,丢失局部性,并且CPU 时间将更多地花在线程调度而不是线程运行上;(干货——一个常见的荔枝,当跑hadoop的时候,发现单节点比多节点用的时间还少,就是这个原因,因为不断进行上下文切换,会带来极大的性能开销)

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

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

相关文章

读入的字节都写入字节数组中_使用Java将文件读入字节数组的7个示例

读入的字节都写入字节数组中嗨,大家好,Java程序员经常在现实世界中遇到编程问题,他们需要将文件中的数据加载到字节数组中,该文件可以是文本文件或二进制文件。 一个示例是将文件的内容转换为String以显示。 不幸的是,…

迭代子模式

转载自 《JAVA与模式》之迭代子模式 在阎宏博士的《JAVA与模式》一书中开头是这样描述迭代子(Iterator)模式的: 迭代子模式又叫游标(Cursor)模式,是对象的行为模式。迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部…

java并发编程实践(2)线程安全性

【0】README 0.0)本文部分文字描述转自:“java并发编程实战”, 旨在学习“java并发编程实践(2)线程安全性” 的相关知识;0.1)几个术语(terms)t1)对象的状态:是指存储在状…

自动配置jdk_JDK 15中自动自动发送更好的NullPointerException消息

自动配置jdk我讨论了期待已久的和高度赞赏改进的NullPointerException ( NPE在帖)消息“ 更好的默认NullPointerException异常消息即将到Java? ”和“ JDK 14中更好的NPE消息 ”。 当此JEP 358驱动的功能添加到JDK 14中时 ,想要从…

tomat(16)关闭钩子

【0】REAMDE0)本文部分文字描述转自:“how tomcat works”,旨在学习“tomat(16)关闭钩子”的相关知识;1)problemsolution:1.1)problem:在很多实际环境中,当用户关闭应用程…

apache.camel_Apache Camel 3.1 – XML路由的快速加载

apache.camelCamel 3.1中添加的一项功能是能够更快地加载XML路由。 这是我们为使Camel变得更小,更快而进行的总体工作的一部分。 您可能会说ewww XML。 但坦率地说,有很多Camel用户使用XML定义路由来构建应用程序。 在Camel 2.x中,您将不得不…

程序中 设置jvm 参数_高效应用程序的7个JVM参数

程序中 设置jvm 参数在撰写本文时(2020年3月),围绕垃圾收集和内存,您可以将600多个参数传递给JVM。 如果您包括其他方面,则JVM参数总数将很容易超过1000个。 😊。 任何人都无法消化和理解太多的论据。 在本…

tomcat(17)启动tomcat

【0】README 1)本文部分文字描述转自“how tomcat works”,旨在学习“tomcat(17)启动tomcat”的相关知识;2)本文重点关注启动Tomcat时会用到的两个类,分别是Catalina类和 Bootstrap类;(干货——…

八爪鱼 是java做的吗_章鱼扫描仪:Java构建工具和恶意软件

八爪鱼 是java做的吗Alvaro Munoz最近在GitHub Security Lab网站上发布了“ Octopus扫描程序恶意软件:攻击开源供应链 ”。 我发现这篇文章很有趣,原因有很多,其中包括对Octopus Scanner恶意软件的工作原理和发现方式的详细介绍, …

spring(1)Spring之旅

【0】README0.1)本文部分文字描述转自:“Spring In Action(中/英文版)”,旨在reviewSpring(1)Spring之旅 的相关知识;【1】简化java 开发1)为了降低java开发的复杂性,Spring采取了以…

apache.camel_Apache Camel K 1.0在这里–您为什么要关心

apache.camel昨天我们发布了Apache Camel K 1.0,并在社交媒体和Camel网站上宣布了该版本。 那么,骆驼K是什么,为什么你要在乎呢? 这是一个很好的问题,我想通过提及伟大的思想来帮助回答这个问题。 Hugo Guerrero发表…

DRF之初识

目录 一、序列化和反序列化 【1】序列化 【2】反序列化 【3】小结 二、DRF的安装和快速使用 (1) 安装DRF: (2) 配置DRF: (3) 创建序列化器(Serializer): (4) 创建视图(View): (5) 配置URL路由: 【补充】下载…

spring(2)装配Bean

【0】README0)本文部分文字描述转自:“Spring In Action(中/英文版)”,旨在review spring(2)装配Bean 的相关知识;1)在spring中,对象无需自己查找或创建与其所关联的其他对象。相反…

restful和rest_HATEOAS的RESTful服务:JVM上的REST API和超媒体

restful和rest1.简介 到目前为止,我们已经花了很多时间谈论了相当数量的关于角色的的超媒体和HATEOAS在REST风格的 Web服务和API,扫视不同规格和可用性方面。 听起来好像支持超媒体和HATEOAS并不难,只需选择您的收藏夹就可以了! …

Spring中配置数据源的4种形式

【0】README 0.1)以下内容转自:http://blog.csdn.net/orclight/article/details/8616103 不管采用何种持久化技术,都需要定义数据源。Spring中提供了4种不同形式的数据源配置方式: spring自带的数据源(DriverManagerDataSource)&…

MavenSelenium测试自动化教程

在进行自动化测试项目时,您需要与之关联的所有Selenium依赖项。 通常,这些依赖项是在项目生命周期中手动下载和升级的,但是随着项目规模的扩大,管理依赖项可能会非常困难。 这就是为什么需要构建自动化工具(例如Maven&…

命令行执行Junit测试

【0】README 0.1)本文旨在给出如何在命令行中执行 Junit测试的steps: 【1】在命令行中执行Junit测试 1)problemsolution: 1.1)problem: 1.2)solution:导出 JUnitCore 类并且使用 …

托管 非托管_如何在托管Kubernetes上还原Neo4J备份

托管 非托管在下面的视频中,我将解释如何将Neo4J实例的备份还原到在托管Kubernetes环境中运行的新实例。 备份内容将从先前写入备份的持久卷中获取。 在上一篇文章中,您可以首先了解如何进行备份。 自己尝试 同样,您将在以下GitHub存储库中…

spring(3)高级装配

【0】README0)本文部分文字描述转自:“Spring In Action(中/英文版)”,旨在review spring(3)高级装配 的相关知识;【1】环境与profile(考虑数据库配置)1)使用嵌入式数据…

jmc线程转储_查找线程转储中的异常和错误

jmc线程转储线程转储是解决生产问题/调试生产问题的重要工件。 在像过去我们已经讨论了几种有效的线程转储故障模式: 堵车 , 跑步机 , RSI , 一个 LL条条大路通罗马 .........。 在本文中,我们想介绍另一种线程转储故障…