常见的并发模型

作为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

常见的并发模型

常见的并发模型_两个常见的并发错误相关推荐

  1. 常见的IO模型_晏无心_新浪博客

    一.服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: 1.同步阻塞IO(Blocking IO):即传统的IO模型. 2.同步非阻塞IO(Non-blocking IO):默认创建的s ...

  2. 系统通知并发问题_玩转Java高并发?请先说明下并发下的惊群效应

    实际项目中,我们有很多高并发的场景需要考虑.设计,在高并发领域有个很有特点的名词叫惊群效应,你了解吗? 一.啥是惊群效应 啥叫惊群效应,有个例子说明的很透彻.当你往一群鸽子中间扔一块食物,虽然最终只有 ...

  3. java 并发修改_理解和解决Java并发修改异常ConcurrentModificationException

    your name.jpg 关键字: Java Exception 不知读者在Java开发的过程中有没有遇到类似的异常信息 Exception in thread "main" j ...

  4. java 单个用户的多重并发会话_单个用户的多重并发会话限制/限制单客户端同时登录多个用户...

    我使用的是SSH2框架,做安全测试需要限制:1.单个用户的多重并发会话限制 2. 限制单客户端同时登录多个用户 .这两个内容,没有采用在web.xml中配置过滤器的方式,我处理的方式是如果一个用户在第 ...

  5. tcp并发服务器_在Go中构建并发TCP服务器

    tcp并发服务器 本文是Mihalis Tsoukalos的"围棋"系列的一部分. 阅读第1部分: 在Go中创建随机,安全的密码 . TCP和UDP服务器无处不在,通过TCP / ...

  6. mysql 高并发 优惠券_转 mysql处理高并发,防止库存超卖

    今天王总又给我们上了一课,其实mysql处理高并发,防止库存超卖的问题,在去年的时候,王总已经提过:但是很可惜,即使当时大家都听懂了,但是在现实开发中,还是没这方面的意识.今天就我的一些理解,整理一下 ...

  7. Golang并发模型:轻松入门协程池

    goroutine是非常轻量的,不会暂用太多资源,基本上有多少任务,我们可以开多少goroutine去处理.但有时候,我们还是想控制一下. 比如,我们有A.B两类工作,不想把太多资源花费在B类务上,而 ...

  8. Java并发编程学习-日记1、常见的IO模型、NIO、OIO

    常见的IO模型: 1.同步阻塞IO(Blocking IO): 在Java中,默认创建的socket都是阻塞.同步IO,是一种用户空间与内核空间的IO发起方式.同步IO是指用户空间的线程是主动发起IO ...

  9. 计算机黑屏的原因及解决办法,导致电脑黑屏的两个常见的原因分析与解决办法_电脑故障...

    导致电脑黑屏的两个常见的原因分析与解决办法_电脑故障 2017年04月21日 阅读 192 电脑黑屏故障的原因有很多种,有时很简单的一个差失就会导致,找到原因后才恍然大悟.下面就是一个电脑黑屏的案例分 ...

最新文章

  1. 带 sin, cos 的线段树 - 牛客
  2. 如何做会员排名 按照投稿文章数量
  3. SSH工具Secure Shell Client的sitting窗口显示不全和窗口页面大小问题解决办法
  4. JVM调优总结(三)-基本垃圾回收算法
  5. Activity的启动流程
  6. linux 2行数据为一条记录 该如何操作这一条记录_Linux 日志文件系统原来是这样工作的...
  7. 蓝桥杯 ALGO-52 算法训练 排列问题
  8. 'SELECT'语句中的'IF' - 根据列值选择输出值
  9. 【Qtcreator】qtcreator的基本使用方法
  10. illustrative visualization思考
  11. 蓝桥杯 算法提高 一元三次方程求解
  12. Ognl表达式(根据Apache-Ognl文档直译)
  13. PHP多功能自动发卡平台源码 带手机版 带多套商户模板
  14. python根据文件名筛选文件_Python-实现筛选出文件夹下含有特定名字的文件
  15. 音响在线测试软件,汽车音响调音在线大师班(1):调音第一步,RTA检测播放表现...
  16. 【Axure原型分享】短视频APP原型模板
  17. 英文单词乱序后还原 c语言,乱序背单词_有谁也用《不背单词》这个软件吗怎么可以改变背单词的顺序有顺序倒序和乱序的_淘题吧...
  18. 一文读懂配置管理(CM)
  19. Android DeepLink使用
  20. 当代最值得收藏的画家作品_当代最具潜力和收藏价值的十大画家

热门文章

  1. 牛客题霸 [ 孩子们的游戏] C++题解/答案
  2. [ZJOI2008]泡泡堂(田忌赛马贪心)
  3. CF765F Souvenirs(势能线段树)
  4. 2021-4-1 多校省选模拟赛
  5. 模板:k短路(可并堆)
  6. 模板:快速莫比乌斯变换(FMT)+快速沃尔什变换(FWT)(多项式)
  7. 8.11模拟:数据结构
  8. CF1019D-Large Triangle【计算几何,二分】
  9. 51nod-有限背包计数问题【dp】
  10. P3225-[HNOI2012]矿场搭建【tarjan,图论】