高效实现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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 lol被惩罚20分钟怎么办 密保手机换号了怎么办 丧尸危机爆发了怎么办 诛仙账号被盗了怎么办 诛仙3账号忘了怎么办 伤害世界车翻了怎么办 诛仙3没用的护符怎么办 灵跃武器选错了怎么办 qq账号不记得了怎么办 突然不来月经了怎么办 闭经2个月了怎么办 闭经怎么办我才19岁 闭经3 4个月怎么办 月经来了十多天了还不走怎么办 3个月没有来月经怎么办 48岁突然没月经怎么办 月经来了疼的厉害怎么办 月经肚子疼怎么办快速止疼 来月经疼的厉害怎么办 22岁闭经6个月怎么办 月经推迟16天了怎么办 月经半年没来了怎么办 月经推迟两个月了还不来怎么办 四个月月经不来怎么办 快两个月没来月经了怎么办 月经停了两个月怎么办 别人诬告我我该怎么办 有人造谣我我该怎么办 宝宝晚上不睡觉哭闹怎么办 婴儿晚上不睡觉哭闹怎么办 2月宝宝排便困难怎么办 3岁宝宝老是哭闹怎么办 2岁了囟门闭合晚怎么办 宝宝卤门闭合慢怎么办 手经常碰水脱皮怎么办 迅雷文件已移除怎么办 手机不读sd卡怎么办 g买卖卖错账号怎么办 森林被野人拖走怎么办 我的世界没有羊怎么办 黑魂3杀死铁匠后怎么办