高效实现Map的原子更新操作(Hystrix的InternMap<K, V>源码解析)
来源:互联网 发布:护眼手机膜 知乎 编辑:程序博客网 时间:2024/06/07 23:48
最近在学习Hystrix框架时,看到有一段代码,挺有意思的,代码如下:
代码清单1-1
public class InternMap<K, V> { private final ConcurrentMap<K, V> storage = new ConcurrentHashMap<K, V>(); private final ValueConstructor<K, V> valueConstructor; public interface ValueConstructor<K, V> { V create(K key); } public V interned(K key) { V existingKey = storage.get(key); V newKey = null; if (existingKey == null) { newKey = valueConstructor.create(key); existingKey = storage.putIfAbsent(key, newKey); } return existingKey != null ? existingKey : newKey; }}
省略了部分非关注代码……
ValueConstructor是函数式接口,作用是传入key获得value值,JDK8引入的新特性。
重点关注上面的interned方法:先是判断key对应的value是否已存在:如果不存在,则通过ValueConstructor产生新的value,并存入storage中。最后返回已存在的value
逻辑很简单,但是上面的代码却写得很复杂,感觉有点啰嗦,一般写法如下:
代码清单1-2
public V interned(K key) { V existingValue = storage.get(key); if (existingValue == null) { existingValue = valueConstructor.create(key); storage.put(key, existingValue); } return existingValue; }
仔细分析下上面简单写法,存在着线程安全问题。由于未进行同步处理,可能出现两个线程同时进入if语句块,从而导致每个线程获得了不同的existingValue,这显然是不希望看到的。
再回过头来看代码1-1,就明白作者的深意了。通过ConcurrentHashMap提供的线程安全的putIfAbsent方法,保证了storage存入时的线程安全,同时通过对newKey、existingKey(实际上应该取名为newValue、existingVaule)两个线程内变量值判断进行返回,保证了整个方法操作的原子性。
这种实现线程安全的方式,没有用同步代码块等比较低效的同步方式,确实是一种高效实现Map的原子更新方式,不得不为作者的深思熟虑感到佩服.......
最后,我想问句:元芳,你怎么看?
0 0
- 高效实现Map的原子更新操作(Hystrix的InternMap<K, V>源码解析)
- Map<K,V>的使用
- 获取 map 的K V
- 使用ConcurrentMap实现高效可靠的原子操作
- 遍历Map<k,v> k,v的几种方法
- 平台无关的高效原子操作:ACE_Atomic_Op
- Map.Entry<K,V> 的简单用法
- Java 处理Map<K,V>的方法
- Map.Entry<K,V> 的理解
- 接口 Map<K,V>的用法
- 【源码分析】HashMap的put(K k,V v)方法
- 原子操作的实现原理
- 原子操作的实现原理
- 原子操作的实现原理
- 原子操作的实现原理
- 原子操作的实现原理
- 原子操作的实现原理
- 原子操作的实现原理
- Android事件分发机制
- Java-001-String和StringBuffer以及StringBuilder
- 数据结构-线性表
- 类的设计
- php7 连接 mysql数据库
- 高效实现Map的原子更新操作(Hystrix的InternMap<K, V>源码解析)
- rtmp complex handshake,支持h264/aac
- 用ajax post array数组到Mvc web Api后台接受不到的问题
- Content Security Policy 入门教程
- PHP学习总结(3)——PHP入门篇之PHP的echo语句
- 自定义view之仿慕课网课程学习圆形进度
- JS事件封装函数,跨浏览器添加事件和删除事件
- ASP:Gridview中的分页和选择
- 中缀表达式转换成前缀和后缀表达式这类题目的超实用解题技巧