为什么ConcurrentHashMap是弱一致的
2015-10-17 09:04
176 查看
转载自并发编程网 – ifeve.com
本文链接地址: 为什么ConcurrentHashMap是弱一致的
本文将用到Java内存模型的happens-before偏序关系(下文将简称为hb)以及ConcurrentHashMap的底层模型相关的知识。happens-before相关内容参见:JLS
§17.4.5. Happens-before Order、深入理解Java内存模型以及Happens before;ConcurrentHashMap的详细介绍以及底层原理见深入分析ConcurrentHashMap。本文将从ConcurrentHashMap的get,clear,iterator(entrySet、keySet、values方法)三个方法来分析它们的弱一致问题。
下面将结合代码和java内存模型相关内容来分析下put/get方法(本文中所有ConcurrentHashMap相关的代码均来自hotspot1.6.0_18)。put方法我们只需关注Segment#put,get方法只需关注Segment#get,在继续之前,先要说明一下Segment里有两个volatile变量:count和table;HashEntry里有一个volatile变量:value。
Segment#put
[code= java; title: ; notranslate" title="">
本文链接地址: 为什么ConcurrentHashMap是弱一致的
本文将用到Java内存模型的happens-before偏序关系(下文将简称为hb)以及ConcurrentHashMap的底层模型相关的知识。happens-before相关内容参见:JLS
§17.4.5. Happens-before Order、深入理解Java内存模型以及Happens before;ConcurrentHashMap的详细介绍以及底层原理见深入分析ConcurrentHashMap。本文将从ConcurrentHashMap的get,clear,iterator(entrySet、keySet、values方法)三个方法来分析它们的弱一致问题。
ConcurrentHashMap#get
get方法是弱一致的,是什么含义?可能你期望往ConcurrentHashMap底层数据结构中加入一个元素后,立马能对get可见,但ConcurrentHashMap并不能如你所愿。换句话说,put操作将一个元素加入到底层数据结构后,get可能在某段时间内还看不到这个元素,若不考虑内存模型,单从代码逻辑上来看,却是应该可以看得到的。下面将结合代码和java内存模型相关内容来分析下put/get方法(本文中所有ConcurrentHashMap相关的代码均来自hotspot1.6.0_18)。put方法我们只需关注Segment#put,get方法只需关注Segment#get,在继续之前,先要说明一下Segment里有两个volatile变量:count和table;HashEntry里有一个volatile变量:value。
Segment#put
[code= java; title: ; notranslate" title="">
相关文章推荐
- Android系统构架
- *LeetCode-Unique Word Abbreviation
- 编写更好 Bash 脚本的 8 个建议
- HttpServletRequest对象方法的用法
- 将图片保存到相册(本地)
- SQL2008 日志清除
- 百度_2016_校招_笔试题_题来了
- SQL CREATE TABLE 语句 高级教程
- 类间关系(转发)
- 软件测试需求
- Qt 连接MySQL数据库
- C++片段
- SQL CREATE DATABASE 语句 高级教程
- C++手稿:静态和全局变量的作用域
- SQL SELECT INTO 语句 高级教程
- 解决更新 Xcode 之后, 插件失效问题
- 请注意CSDN社区微通道,许多其他的精彩等着你
- (转)Unity3D移动平台动态读取外部文件全解析
- C++ 最简单的string与wstring互相转换
- 全局最小割Stoer-Wagner算法 时间复杂度(o^3)