理想情况来讲,开发在开始编写代码之前就应该讲并发情况考虑进去,但是大多数实际情况确是,开发压根不会考虑高并发情况下的业务问题。主要原因还是因为业务极难遇到高并发的情况。

下面列举两个比较常见的后端编码中常见的并发BUG:

Bean中的请求状态

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

代码如下:

public void handleOrder(Order order) {

...

currentLineItem = order.getLine(0);

processLineItem();

}

private void processLineItem() {

myService.store(currentLineItem);

}

这违反了两个原则:线程安全和有意义的对象状态。这里处理一个order对象的时候只是处理了其中一个的currentLineItem,先是赋值给了当前类对象的属性,然后去处理这个currentLineItem对象,但是如果多个线程同时请求到当前的类单例对象,那么赋值和处理对象中间会发生第二次赋值,此时再去处理currentLineItem对象很可能已经不是之前order对象的currentLineItem。

如果将请求的每个属性放入该请求的接收者中,那么将有两个风险:在多线程执行中的请求之间出错

如果事情没有完全处理完,则在单线程的请求之间出错

对象初始化错误

延迟初始化允许:

由于以下原因,启动速度更快必要时及时加载资源

如果不需要,则不加载资源(例如,无服务器Lambda,在其生命周期中可能永远不会被要求执行特定的代码路径)

加载优先活动资源

虽然如此,但是,如下代码可能会发生错误:

private LazyService getLazyService() {

if (lazyService != null) {

return lazyService;

}

LazyService newLazyService = connectToLazyService();

registerWithServiceRegistry(newLazyService);

lazyService = newLazyService;

return newLazyService;

}

尽管它可以工作,但并发调用很可能出错。在示例中:在并发调用中,发生了多个延迟加载

如果发生多个延迟加载,则可能两个对象在内存中的停留时间超长或者永远存在

如果这是单例,初始化过程中的多余对象可能会获取到唯一的资源导致无法正常工作

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

private volatile static Singleton singleton;

public static Singleton getSingleton() {

if (singleton == null) {

synchronized (Singleton.class) {

if (singleton == null) {

singleton = new Singleton();

}

}

}

return singleton;

}郑重声明:文章首发于公众号“FunTester”,禁止第三方(腾讯云除外)转载、发表。

技术类文章精选

非技术文章精选

java服务端高并发问题_Java服务端两个常见的并发错误相关推荐

  1. 常见的并发模型_两个常见的并发错误

    常见的并发模型 作为Baeldung的编辑,我很高兴与一位作者一起撰写有关Java通用并发陷阱的文章. 这是一本不错的书,但是假设开发人员具有一定的能力. 我已经看到了几件即时并发失败的事情. 它们很 ...

  2. java调用接口失败重调_Java调用WebService接口的常见错误

    1.如果出现这个错误:java.lang.NoClassDefFoundError: javax/xml/soap/SOAPException,原因是没有导入 axis2-saaj.jar包 2.如果 ...

  3. java怎么设置快速修复键_Java开发环境之------MyEclipse快捷键和排除错误第一选择ctrl+1(***重点***:ctrl+1,快速修复---有点像vs中的快速using...

    [摘要:1,MyEclipse快速键设置装备摆设方式 2,经常使用快速键 : (1),alt+/ //内容提醒, 近似于vs中的ctrl+j ,即单词提醒,输进单词的前几个字母,然后提醒大概的单词. ...

  4. Centos7+Nginx+Keepalived实现Apache服务的高可用负载均衡

    Centos7+Nginx+Keepalived实现Apache服务的高可用&负载均衡 今天是2017年的第一天,昨天也就是2016年的最后一天,我尝试部署了Centos7+Nginx+Kee ...

  5. Java进阶知识点5:服务端高并发的基石 - NIO与Reactor模式以及AIO与Proactor模式

    一.背景 要提升服务器的并发处理能力,通常有两大方向的思路. 1.系统架构层面.比如负载均衡.多级缓存.单元化部署等等. 2.单节点优化层面.比如修复代码级别的性能Bug.JVM参数调优.IO优化等等 ...

  6. 8000 字 + 21 张图,服务端高并发分布式架构 14 次演进之路

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | huashiou 来源 | sf.gg/a/1 ...

  7. Java生鲜电商平台-SpringCloud微服务架构高并发参数优化实战

    Java生鲜电商平台-SpringCloud微服务架构高并发参数优化实战 一.写在前面 在Java生鲜电商平台平台中相信不少朋友都在自己公司使用Spring Cloud框架来构建微服务架构,毕竟现在这 ...

  8. 最全Java架构师130面试题:微服务、高并发、大数据、缓存等中间件

    一.数据结构与算法基础 · 说一下几种常见的排序算法和分别的复杂度. · 用Java写一个冒泡排序算法 · 描述一下链式存储结构. · 如何遍历一棵二叉树? · 倒排一个LinkedList. · 用 ...

  9. 淘宝服务端高并发分布式架构演进之路

    点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 1. 概述 本文以淘宝作为例子,介绍从一百个并发到千万级并发情况下服务端的架构的演进过程,同时列 ...

最新文章

  1. 迁移学习前沿研究亟需新鲜血液,深度学习理论不能掉链子
  2. 图像分类matlab结果,libsvm图像二分类后,分类的图像结果如何显示?
  3. ASP.NET 2.0 正式版中无刷新页面的开发
  4. 剑指offer全套题解:Python版
  5. 酷客多基金在济南大学成立“酷客多奖助学金“
  6. 显示桌面,原来这么简单的
  7. 解析Windows 2000/XP进程工作集
  8. Android 系统 (79)---Android应用程序安装过程解析
  9. 从事前端多年,我是这样看待三大框架的
  10. 种草 ES2020 八大新功能
  11. 程序媛报告:调查了 12,000 名女性开发者发现,女性比男性更懂 Java!
  12. VB更改任何标题程序源代码
  13. [译]Flask教程--将表单数据发送到模板
  14. 10月15号和16号PC端云音乐项目总结
  15. PHP上传文件到项目public路径接口
  16. RHCE(DHCP报文)
  17. postgresql 累乘
  18. 现行各主流语言的特点
  19. npm报错`webpack-dev-server --inline --progress --config build/webpack.dev.conf.js`
  20. 海藻酸钠-PEG-N-羟基琥珀酰亚胺 NHS-PEG-alginate

热门文章

  1. 关于清理「死代码」,我有一些好方法推荐给你
  2. 管理大型共享数据库,做到这几点不再头疼!
  3. 人人都可做 AI 开发者,云知声 AI 开放平台重磅上线
  4. 为什么持续集成和部署在开发中非常重要?
  5. “我们完全误解了区块链!”
  6. 你绝对想不到,会Linux的程序员,到底有多吃香!
  7. 腾讯回应 QQ 被工信部通报;由微软老兵领导,Facebook 开发新操作系统;Node.js 13.4.0 发布 | 极客头条...
  8. 4种最常问的编码算法面试问题
  9. 这本Python算法书有点火~
  10. 如何向父母解释什么是爬虫?