首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >并发应用中的不可变数据结构

并发应用中的不可变数据结构

作者头像
物流IT圈
发布2020-01-17 15:11:51
6240
发布2020-01-17 15:11:51
举报
文章被收录于专栏:物流IT圈物流IT圈

并发并行编程是当前热点,过去我们知道使用锁synchronization来解决多线程并发访问同一个数据结构时共享问题,甚至我们怀疑数据共享方式本身是不是就错了?所以,云计算的数据喂任务模式开始盛行,但是数据共享方式从我们开始软件第一天就已经习惯,如何在这个共享模式下实现高并发访问呢?也就是不使用锁synchronization,那么就通过不变性Immutable模式来实现。 Immutable Data Structures in Concurrent Java Applications(http://www.objectpartners.com/2010/02/01/immutable-data-structures-in-concurrent-java-applications/)提出了实现集合对象边读边修改的并发实现方式。 首先指出volatile 的不足,因为不能保证操作volatile 字段方法的原子性,这样,还是需要锁synchronization来修饰其操作方法,该文提出使用final来替代volatile,如果需要修改final的字段值,就用这个对象来替换,这个概念符合DDD中值对象定义,值对象是不可变的,一旦变化,整个对象更换,同时也符合并发模型,如下类:

如果我们有一个Contact对象的集合:联系人名单集合,然后给这个名单中每个联系人发送Email: public void sendMessages(Map contactMap) { sendEmail(contactMap.values()); } contactMap是Contact集合,contactMap.values是遍历contactMap中元素Contact对象。如果在遍历发生Email同时,有新的Contact对象加入到contactMap集合中,这时会抛出并发错误。当然,可以使用ConcurrentMap来实现Map。 但是该文提出一个不可变Map也许能获得更好的并发性能。

该Map的特点就是遵循值对象模型的特点,集合Map作为一个值对象模型,一旦其元素发生变化,如新增或删除元素,返回一个新的集合Map对象。 获得使用该不可变Map的代码如下:

这样,通过避免使用锁synchronization,而是通过业务设计出值对象,然后使用不可变模式来获得更好的性能,从这里也可以看出面向对象设计并不会影响性能,反而能提升性能。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 驼马精英 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 并发并行编程是当前热点,过去我们知道使用锁synchronization来解决多线程并发访问同一个数据结构时共享问题,甚至我们怀疑数据共享方式本身是不是就错了?所以,云计算的数据喂任务模式开始盛行,但是数据共享方式从我们开始软件第一天就已经习惯,如何在这个共享模式下实现高并发访问呢?也就是不使用锁synchronization,那么就通过不变性Immutable模式来实现。 Immutable Data Structures in Concurrent Java Applications(http://www.objectpartners.com/2010/02/01/immutable-data-structures-in-concurrent-java-applications/)提出了实现集合对象边读边修改的并发实现方式。 首先指出volatile 的不足,因为不能保证操作volatile 字段方法的原子性,这样,还是需要锁synchronization来修饰其操作方法,该文提出使用final来替代volatile,如果需要修改final的字段值,就用这个对象来替换,这个概念符合DDD中值对象定义,值对象是不可变的,一旦变化,整个对象更换,同时也符合并发模型,如下类:
  • 如果我们有一个Contact对象的集合:联系人名单集合,然后给这个名单中每个联系人发送Email: public void sendMessages(Map contactMap) { sendEmail(contactMap.values()); } contactMap是Contact集合,contactMap.values是遍历contactMap中元素Contact对象。如果在遍历发生Email同时,有新的Contact对象加入到contactMap集合中,这时会抛出并发错误。当然,可以使用ConcurrentMap来实现Map。 但是该文提出一个不可变Map也许能获得更好的并发性能。
  • 该Map的特点就是遵循值对象模型的特点,集合Map作为一个值对象模型,一旦其元素发生变化,如新增或删除元素,返回一个新的集合Map对象。 获得使用该不可变Map的代码如下:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档