两个常见的并发错误

作为Baeldung的编辑,我很高兴与一位作者一起撰写有关Java通用并发陷阱的文章。 这是一本不错的书,但是假设开发人员具有一定的能力。

我已经看到了几件即时并发失败的事情。 它们很容易添加到代码中,并保证为您提供奇怪的结果。 开发人员仍会提交这些事实,这是对我们如何对OO和并发进行教育的一种评论,如果使用不当,这将非常危险。

除了代码审查

作为代码审查员,这些年来我已经开发了一些速记。 这些帮助我发现了在较大的代码更改中需要更详细地研究的区域。 它们包括红旗的事情,我希望出问题。 训练自己去发现关键的反模式或潜在的反模式是一个好主意,因为它们可以是有效的代码,但会导致无效的行为。

Bean中的请求状态

在Java应用程序中,服务,控制器,处理程序和存储库通常是单例的。 它们是在应用启动时创建的,然后请求通常通过多个线程传递给它们。

考虑如下代码:

 public void processOrder(Order order) { ... currentLineItem = order.getLine( 0 ); processLineItem();  }  private void processLineItem() { myService.store(currentLineItem);  } 

在这种情况下,该类的作者已决定该对象可以记住其当前正在处理的项目,从而节省了将该项目传递给下一个函数的工作。

这违反了两个原则:线程安全和有意义的对象状态。 订单处理者不太可能真正了解其正在处理的订单。 您可能会想像一些有状态地遍历某个订单,某种游标,阅读器或构建器的项目,但是将所有这些项目混合到一个对象中则很麻烦。

不过,最重要的是,有一个明确的定义可以解释为什么这是错误的。 如果将请求的每个属性放入该请求的接收者中,那么您将有两个风险:

  • 在多线程执行中的请求之间出血
  • 如果事情没有完全整理,则在单线程的请求之间流血

简而言之,永不做!

疯狂的懒惰初始化

延迟初始化允许:

  • 由于更快的启动
  • 必要时及时加载资源
  • 如果不需要,则不加载资源(例如,无服务器Lambda,在其生命周期中可能永远不会被要求执行特定的代码路径)
  • 定制如何通过较早发生的活动加载资源

所有这些都很好。 但是,此代码:

 private LazyService getLazyService() { if (lazyService != null ) { return lazyService; } LazyService newLazyService = connectToLazyService(); registerWithServiceRegistry(newLazyService); lazyService = newLazyService; return newLazyService;  } 

尽管它可以工作,但可以同时调用并出错。 它的错误程度取决于各种各样的事情。 在示例中,我试图暗示我们正在处理的事情:

  • 在并发调用中,发生了多个延迟加载…
  • ……如果这很昂贵,那是浪费
  • 如果发生多个懒惰加载,则可能两个对象在内存中的驻留时间超过了所需时间,或者永远存在
  • 如果这是单例,则获取孤立对象的请求可能无法与其余请求协调
  • 使用手工进行的非线程安全的对象初始化真是遗憾

为了正确进行单例初始化,您应该使用双重检查锁定或使用框架,甚至明智地使用基于static字段的简单Java单例。

其他并发失败

以上两个似乎是最常见的错误,以至于显而易见。 如果发现另一个,请将其放在评论中。

翻译自: https://www.javacodegeeks.com/2020/01/two-common-concurrency-bugs.html

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

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

相关文章

AWS Loft的数据库周

这是我的笔记: https://databaseweekoctober2019sf.splashthat.com AWS上的数据库:正确工作的正确工具 在许多此类谈话中,我并没有做过深刻的记录。 我正在关注重点。 PostgreSQL排在MySQL之后。 AWS上8种类型的数据库: 关系…

Log4j Bug –减慢您的应用程序

最近,我们正在对流行的SaaS应用程序进行故障排除。 该应用程序间歇性地减慢了速度。 要从问题中恢复,必须重新启动应用程序。 在高流量期间,此应用有时会变慢; 有时在交通繁忙时也是如此。 没有凝聚力模式。 这种应用程序变慢并重…

javafx透明边框_JavaFX技巧6:使用透明颜色

javafx透明边框为用户界面元素选择正确的颜色始终是一个很大的挑战,但是当您开发可重用的框架控件时,开发人员就无法控制使用它们的应用程序的外观和感觉,这甚至更具挑战性。 尽管您可能总是将元素添加到默认的灰色背景之上,但是嵌…

win10 更新 英特尔显示器音频 后显示器音箱没有声音

问题 如题,win10系统更新后显示器音箱没有声音,且右击桌面声音查看播放设备 (说明:这是在解决问题之后截的图,没解决前,只有一个“扬声器/听筒”,原先是存在BenQ LCD的) 解决过…

unity ppr_智能自动PPR更改事件策略

unity pprADF开发人员普遍认为,将迭代器绑定更改事件策略设置为ppr在性能方面不是一件好事,因为此策略会强制框架刷新每个请求上绑定到此迭代器的所有属性绑定。 这不是真的! 框架仅刷新在请求期间已更改的属性和依赖于已更改属性的属性。 …

如何构建一个Maven插件

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 今天尝试Okta。 由于其插件生态系统的普及,Apache Maven仍然是Java领域中最流行的构建工具。 很容易找到一个现有的插件来…

javafx中css选择器_JavaFX技巧12:在CSS中定义图标

javafx中css选择器当您是像我这样来自Swing的UI开发人员时,您很有可能仍在代码中直接设置图像/图标。 最可能是这样的: import javafx.scene.control.Label; import javafx.scene.image.ImageView;public class MyLabel extends Label {public MyLabel(…

python去除图像光照不均匀_CVPR 2020 | 从重建质量到感知质量:用于低光照增强的半监督学习方法...

CVPR 2020 | 从重建质量到感知质量:用于低光照增强的半监督学习方法Code: https://github.com/flyywh/CVPR-2020-Semi-Low-Light1背景本篇为大家介绍我们组被2020年IEEE国际计算机视觉与模式识别会议(CVPR 2020)接收的工作《From Fidelity to Perceptual Quality: A…

多层陶瓷电容器用处_【科普贴】多层陶瓷电容器的制造工序,你知道吗?

本文将向大家介绍多层陶瓷电容器的结构及制造工序。多层陶瓷电容器的基本结构电容器用于储存电荷,其最基本结构如图1所示,在2块电极板中间夹着介电体。图1. 电容器的基本结构电容器的性能指标也取决于能够储存电荷的多少。多层陶瓷电容器为了能够储存更多…

分段式多级离心泵_离心泵与多级离心泵工作原理

离心泵工作原理:离心泵工作时,液体注满泵壳,叶轮高速旋转,液体在离心力作用下产生高速度,高速液体经过逐渐扩大的泵壳通道,动压头转变为静压头。性能特点:高效节能:泵有高效的水力形…

牛客网数据开发题库_数据库刷题—牛客网(21-30)

21.查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序CREATE TABLE employees ( emp_no int(11) NOT NULL, birth_date date NOT NULL, first_name varchar(14) NOT NULL, last_name varchar(16…

弹性堆栈介绍

当您运行对公司至关重要的软件时,您将无法获得仅用于分析一段时间前发生的事情的日志,让客户端告诉您您的应用程序已损坏,而您甚至不知道发生了什么是真实的问题。 解决该问题的方法之一是使用监视和日志记录。 大多数应用程序都将具有日志记…

access统计没有选课的人数_当代大学生发愁求职就业,更发愁“选课”,自主选课变成了负担...

当代大学生除了求职就业,最发愁的就是“选课”。不得不说,随着科技的发展,各行各业都发生了翻天覆地的变化。而在大学里的选课,也因此有了巨大的改变。过去,大学生上课,其实课程都是被安排好的,…

产线数字化软件源码_品质笔记⑥丨卢宇聪:把握数字化趋势,坚定创新发展道路...

6天5夜,跨越3座城市,深度走访7家企业,对话多位企业家……这是一趟开阔视野之旅。我接触了很多之前极少有机会接触的企业,比如做光缆的法尔胜泓晟集团、做节能装备的双良集团、做密封件的天生密封件有限公司等。我以前经常接触的是…

es 安装kopf_Elasticsearch-kopf导览

es 安装kopf当我需要一个插件来显示Elasticsearch的集群状态时,或者需要深入了解通常为经典插件elasticsearch-head所达到的索引时。 由于有很多建议,而且似乎是非官方的继任者,所以我最近更详细地研究了elasticsearch-kopf 。 我喜欢它。 我…

arm 交叉编译找不到so_搭建交叉编译环境并验证

1. 搭建编译环境并验证1.1 实验目的 掌握嵌入式开发环境、交叉编译器的搭建、安装和配置方法 熟悉Linux应用程序的编译、调试方法,能够验证X86平台和ARM平台的差异1.2 实验内容 交叉编译器环境搭建 编写一个典型的Linux应用程序 使用GDB调试Linux程序(PC平台) 用Mak…

雷达的工作原理示意图_电磁阀的构成和工作原理示意图

电磁阀符号的含义:电磁阀符号由方框、箭头、“T”和字符构成。电磁阀图形符号的含义一般如下:1、用方框表示阀的工作位置,每个方块表示电磁阀的一种工作位置,即“位”。有几个方框就表示有几“位”,如二位三通表示有两…

sqlserver拼接字符串换行_1.3【Python】第三章 字符串

人工智能入门与实战第一季:python基础语法字符串是比较常见的数据类型,在第一章中我们最早接触的数据类型就是字符串:"hello world",字符串可以用单引号’‘或双引号""来表示代码示例:name "…

mot数据集_谈谈ReID与MOT的关系

1.ReID与MOT的联系在MOT任务中,一般常用的特征模型有运动模型和表观模型,其中表观模型以行人重识别(ReID)类算法为主流。Re-ID任务主要解决的是跨摄像头场景下行人的识别与检索,其中存在给定了身份的图片序列query,需要为不同摄像…

jClarity:在Azure上升级到Java

在互联世界公共基础结构的新时代,最大和最重要的两个方面是Java和OpenJDK的诞生和兴起。 因此,许多公司将时间和资源投入到构建最先进的技术上,以确保整个行业在未来几年内在AdoptOpenJDK上拥有丰富的质量,而且免费的OpenJDK二进制…