HashMap——ConcurrentHashMap
HashMap——ConcurrentHashMap 姚博文 文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/3_program/java/javajs/2008515/116887.html ConcurrentHashMap 是 Doug Lea 的 在7月份的那期 Java理论与实践(“Concurrent collections classes”)中,我们简单地回顾了可伸缩性的瓶颈,并讨论了怎么用共享数据结构的方法获得更高的并发性和吞吐量。有时候学习的最好方法是分析专家的成果,所以这个月我们将分析 Doug Lea 的 针对吞吐量进行优化 多个写锁
map 范围的操作 JMM概述 按照 JLS 的说法,“在没有显式同步的情况下,一个实现可以自由地更新主存,更新时所采取的顺序可能是出人意料的。”其意思是说,如果没有同步的话,在一个给定线程中某种顺序的写操作对于另外一个不同的线程来说可能呈现出不同的顺序, 并且对内存变量的更新从一个线程传播到另外一个线程的时间是不可预测的。 虽然使用同步最常见的原因是保证对代码关键部分的原子访问,但实际上同步提供三个独立的功能——原子性、可见性和顺序性。原子性非常简单——同步实施一个可重入的(reentrant)互斥,防止多于一个的线程同时执行由一个给定的监视器保护的代码块。不幸的是,多数文章都只关注原子性方面,而忽略了其他方面。但是同步在 JMM 中也扮演着很重要的角色,会引起 JVM 在获得和释放监视器的时候执行内存壁垒(memory barrier)。 一个线程在获得一个监视器之后,它执行一个读屏障(read barrier)——使得缓存在线程局部内存(比如说处理器缓存或者处理器寄存器)中的所有变量都失效,这样就会导致处理器重新从主存中读取同步代码块使用的变量。与此类似,在释放监视器时,线程会执行一个写屏障(write barrier)——将所有修改过的变量写回主存。互斥独占和内存壁垒结合使用意味着只要您在程序设计的时候遵循正确的同步法则(也就是说,每当写一个后面可能被其他线程访问的变量,或者读取一个可能最后被另一个线程修改的变量时,都要使用同步),每个线程都会得到它所使用的共享变量的正确的值。 如果在访问共享变量的时候没有同步的话,就会发生一些奇怪的事情。一些变化可能会通过线程立即反映出来,而其他的则需要一些时间(这由关联缓存的本质所致)。结果,如果没有同步您就不能保证内存内容必定一致(相关的变量相互间可能会不一致),或者不能得到当前的内存内容(一些值可能是过时的)。避免这种危险情况的常用方法(也是推荐使用的方法)当然是正确地使用同步。然而在有些情况下,比如说在像 ConcurrentHashMap 实现 清单1. ConcurrentHashMap 使用的 Map.Entry 元素
不用锁定遍历数据结构 大多并发类使用同步来保证独占式访问一个数据结构(以及保持数据结构的一致性)。 使用不变性 新的 JMM 为 final 型变量提供初始化安全,而老的 JMM 不提供,这意味着另一个线程看到的可能是 final 字段的默认值,而不是对象的构造方法提供的值。实现必须能够同时检测到这一点,这是通过保证 检索操作 清单2. ConcurrentHashMap.get() 实现
删除操作 清单3. ConcurrentHashMap.remove() 实现
图1为删除一个元素之前的 hash 链: 图1. Hash链 图2为删除元素3之后的链: 图2. 一个元素的删除过程 插入和更新操作 弱一致的迭代器 动态调整大小 不锁定? 结束语 |
HashMap——ConcurrentHashMap相关推荐
- 理解Java7和8里面HashMap+ConcurrentHashMap的扩容策略
### 前言 理解HashMap和ConcurrentHashMap的重点在于: (1)理解HashMap的数据结构的设计和实现思路 (2)在(1)的基础上,理解ConcurrentHashMap的并 ...
- 浅谈HashTable, HashMap, ConcurrentHashMap 之间的区别
大家好,今天为大家带来新的知识, HashTable, HashMap, ConcurrentHashMap 之间的区别 ...
- java多线程之hashmap concurrenthashmap的状态同步
最近在高并发的系统中发现,concurrenthashmap除了大家熟知的避免循环期间发生ConcurrentModificationException异常外,还有重要的一点是Retrievals r ...
- jdk1.8 HashMap ConcurrentHashMap
JDK1.8逐字逐句带你理解ConcurrentHashMap https://blog.csdn.net/u012403290 JDK1.8理解HashMap https://blog.csdn.n ...
- HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
前言 Map 这样的 Key Value 在软件开发中是非常经典的结构,常用于在内存中存放数据. 本篇主要想讨论 ConcurrentHashMap 这样一个并发容器,在正式开始之前我觉得有必要谈谈 ...
- HashMap, ConcurrentHashMap 原理及源码
阅读文本大概需要3分钟. 原文:https://javadoop.com/post/hashma 网上关于 HashMap 和 ConcurrentHashMap 的文章确实不少,不过缺斤少两的文章比 ...
- HashMap面试题 头插法、尾插法、hash冲突、数组扩容、ConcurrentHashMap
文章目录 HashMap 的数据结构? HashMap 的工作原理? HashMap 的 table 的容量如何确定?loadFactor 是什么?该容量如何变化?这种变化会带来什么问题? 数组扩容的 ...
- 面试:HashMap 夺命二十一问!鸡哥都扛不住~
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:cnblogs.com/Young111/p/1151995 ...
- 面试:HashMap 夺命二十一问!
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 菜鸟小于 来源 | cnblogs.com/Y ...
最新文章
- 初中教师资格证计算机试讲教案模板,初中数学教师资格证面试教案模板: 《投影》...
- 深度学习-Tensorflow2.2-图像处理{10}-图像定位/优化/图运算/及GPU优化等-22
- 城市间紧急救援 (25 分)【dijkstra模板 超时原因】
- Ant in Action读书笔记(三):在Ant中导入环境变量
- 选课网站html源码,选课系统网页制作(26页)-原创力文档
- MySQL 获取首次登录日期、登录设备号
- Python二:【ImageEnhance】+【PIL模块】如何利用python实现图像增强
- Java简单方法批量修改Windows文件夹下的文件名(简单IO使用)
- Netflix:当你按下“播放”的时候发生了什么?
- php5d,php挖洞基础知识篇以及防范方法
- httpclient4.3+jsoup模拟登陆河北移动
- 溢出植入型木马(后门)的原型实现 作者:FLASHSKY(原创)
- 【世界最佳旅游win7主题】
- APP消息推送后端java实现
- python卡方拟合性检验_卡方检验
- 活动倒计时HTML,活动倒计时代码(精确到毫秒)jquery插件
- 星光大道视频播放器精品版
- 遍历$.each()和$().each()用法
- 中年刘强东背后,是已婚男性的集体挣扎
- 教育:构造主义和机能主义
热门文章
- sql checksum_SQL Server中的CHECKSUM页面验证
- sql azure 语法_如何将内部SQL Server数据库迁移到Azure
- aws rds恢复数据库_使用AWS Glue将数据从AWS S3加载到AWS RDS SQL Server数据库
- as5 samba 图形配置
- 求01矩阵中的最大的正方形面积
- Oracle Solaris 本地安全漏洞2
- 活与死、回调以及面向对象设计
- 你的第一杯Web 2.0 —— 快速浏览jQuery、Spring MVC和XStream/Jettison
- 集合交集,并集,差集运算
- The least round way CodeForces - 2B (DP 矩阵 路径)