Golang 异步对象序列化Map并发冲突和解决方法
冲突过程
异步对象序列化,对象里面如果有map,并且使用json.marshal to string,或者其他方式对map 执行了read、write操作。
而业务逻辑同步写对象map值,那么,就会触发: fatal error: concurrent map read and map write
本质原因在于:两个goroute对同一个map执行了读写并发,而golang map默认是不支持并发操作、没有加锁
冲突解决
(1)在主业务逻辑里面,提前把对象转为string,丢给异步任务去执行(不局限写log,可以是其他对map的操作)
(2)map 的读写加锁,而读写加锁对性能的影响,以及死锁等又带来新的麻烦。
关于优化并发map的可以参考这个分析,比较全面:https://misfra.me/optimizing-concurrent-map

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Swift 2.3升级到Swift 3.0小记
阿里云App从Swift 2.1开始使用Swift,随时不断的推进,现在所有的业务代码都用Swift编写。由于Swift 3.0语法上有诸多改变,所以从Swift 2.3升级到Swift 3.0是一件宜早不宜迟的事情。元旦期间抽了点时间做这个升级。 外部依赖 目前开源社区对Swift 3.0支持是非常好的,我们依赖的开源组件最新版本都支持Swift 3.0了,所以并没有什么不能解决的依赖。 因为很多组件依赖CocoaPods 1.x才能编译,所以前期我们花了一些时间支持CocoaPods 1.1.1。 因为目前Swift相关的动态库仍然会打进App里面,所以升级到Swift 3.0,并不影响对iOS8、iOS9的支持。 升级过程 先将所有组件一个一个升级到Swift 3.0的语法。组件化的好处是可以并行,先解决基础组件,然后大家并行解决高级组
- 下一篇
BeanUtils,不同 jar 包所埋的坑
背景 线上代码,两个地方使用了相同的copy 方式,但是执行的效果却完全不一样。 BeanUtils.copyProperties(invoiceMonth, invoiceMonthDTO); 问题描述 1、我们的项目使用了 Spring 包和 Apache 包两种,而这两个包都提供了 BeanUtils 工具方法 2、看一下源码: 1)、Apache 源码是,第一参数:dest;第二参数:source。 public static void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException { BeanUtilsBean.getInstance().copyProperties(des
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Hadoop3单机部署,实现最简伪集群
- CentOS8编译安装MySQL8.0.19
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS6,CentOS7官方镜像安装Oracle11G