两个常见的并发错误

作为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,一经查实,立即删除!

相关文章

kotlin自定义View出现 java.lang.ClassNotFoundException

问题1:找不到所引用的自定义View Didn’t find class “dxf.example.dxf.customviewdemo.MyTextView” on path: DexPathList 原因:build.gradle中 应用插件 解决:添加 apply plugin: ‘kotlin-android’ 问题2: java.lang.Cl…

javafx swing_JavaFX技巧9:请勿混用Swing / JavaFX

javafx swingJavaFX团队非常努力地说服我们,因为可以将Swing内容嵌入JavaFX UI中,反之亦然,因此从Swing迁移到JavaFX很容易。 我必须承认,我从来没有尝试过,但是根据我从客户那里得到的反馈,我只能建议不要…

kotlin-unresolved reference daclaredFunctions

问题:如题 原因: 默认编译时不导入kotlin-reflect.jar包导致,所以在该包中的默认不能使用 解决 需额外在dependencies中添加 kotlin-reflect的编译, compile “org.jetbrains.kotlin:kotlin-reflect:$kotlin-version”

AWS Loft的数据库周

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

MockWebServer[45678] connection from null failed: java.net.SocketException

MockWebServer使用中的异常 MockWebServer: MockWebServer[45678] connection from null failed: java.net.SocketException: sendto failed: EBADF (Bad file number) java.io.IOException: unexpected end of stream on Connection Caused by: java.io.EOFException: \n n…

ExternalDocumentationLinkImpl(url=https://developer.android.com/reference/, packageListUrl=https://d

dokka 问题 java.lang.RuntimeException: Exception while loading package-list from ExternalDocumentationLinkImpl(urlhttps://developer.android.com/reference/, packageListUrlhttps://developer.android.com/reference/package-list) 原因 使用了下面这个任务定义…

IntellijIDEA插件编写-删除/插入/替换文档内容

错误 ERROR - plication.impl.ApplicationImpl - Assertion failed: Write2018-03-24 01:57:49,835 [ 138880] ERROR - plication.impl.ApplicationImpl - Assertion failed: Write access is allowed inside write-action only (see com.intellij.openapi.application.Appli…

jaxb_JAXB –新手的观点,第1部分

jaxb我知道你们中的很多人已经在想什么,所以让我们摆脱这个问题:“ JAXB? 如XML? 来吧,所有很棒的孩子都在使用JSON。” 关于XML与JSON的辩论以及许多促成它的论据都得到了很好的记录。 我不会花很多时间在这里重新整…

Log4j Bug –减慢您的应用程序

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

androidstudio --debug 出现 source code not match bytecode

问题 如标题 原因 编译api版本与运行app的模拟器api版本不一致 解决 换成API版本一致的模拟器运行app即可

android monitor突然不能显示

问题 如题 原因 不清楚。。。。 解决 方式一-有副作用(原因不明)-debug可能会一直 wait attach,不能进入调试模式 先将Android NDK support plugin禁用(重启androidstudio)右击android monitor,选择remove from …

jvm虚拟机 基于栈_守护基于JVM的应用程序

jvm虚拟机 基于栈部署体系结构设计是任何定制服务器端应用程序开发项目的重要组成部分。 由于其重要性,部署架构设计应尽早开始,并与其他开发活动一起进行。 部署体系结构设计的复杂性取决于许多方面,包括所提供服务的可伸缩性和可用性目标&a…

ListView中让TextView中的文字进行单独滚动

TextView不能在ListeView中单独的滚动原因 默认ListView将会拦截MOVE事件向下传递 参见源码 case MotionEvent.ACTION_MOVE: {switch (mTouchMode) {case TOUCH_MODE_DOWN:int pointerIndex ev.findPointerIndex(mActivePointerId);if (pointerIndex -1) {pointerIndex 0;…

JPA @Embeddable和@Embedded

介绍: 作为一个面向对象的开发人员,我们希望避免使用带有大量不相关字段的大型类。 因此,我们可能经常感到有必要使用多个对象来表示JPA实体。 在本快速教程中,我们将学习如何使用JPA或Hibernate中的Embedded和Embeddable注释来实…

android monitor不能查看/data目录

问题 在android 7.0虚拟机上不能查看/data目录 解决 1. 修改目录权限 开始->cmd->adb shell->chmod -R 777 /data 2. root虚拟机 先执行 adb root,再执行 adb remount 出现remount succeeded表示可以了

Sqlite error- INSERT failed: datatype mismatch

问题 sqlite3 使用.import命令导入输入出现error-INSERT failed: datatype mismatch 原因 文件字段的默认分隔符为“|”,而从excel转换的.csv文件默认为逗号,所以导致文件解析出错,进而 “数据类型不匹配” 解决 在.import命令前修改分隔…

反射-获取java私有内部类反射类型、私有字段

获取JAVA私有内部类反射类型 方式一 Class.forName(“外部类完整路径$内部私有类类名”); 方式二 通过获取对应私有内部类的字段而获取 完整的类名 Class.forName(field.getType().getName()) 获取JAVA私有字段 Class.forName(“类完整路径”).getDelcaredField(“字段名…

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

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

android-创建sdcard

进入sdk 安装路径 tools目录下 mksdcard 100M D:\dxfSDCard.img //创建一个100M的sdcard

Apache Ivy 2.5.0发布

本周,我们发布了Apache Ivy的 2.5.0版本。 Apache Ivy是与Apache Ant构建工具集成的构建依赖项管理器。 可以照常从https://ant.apache.org/ivy/download.cgi下载该下载。 该2.5.0版本是在Ivy发行版中存在很大差距之后发布的。 2.4.0于2014年12月26日发布。此后&am…