- 浏览: 220202 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
julyboxer:
http://www.baobao5u.com/Product ...
喝茶的十八个层次,你属于哪一层? -
xiaolong0211:
呵呵,学习了,这两天一直在装gcc,可算装上了,谢谢
Red Hat enterprise 5 gcc安装顺序 -
run_xiao:
翻译的不是很到位啊
推荐引擎mahout相关资料 -
julyboxer:
关键价值链
B2C网络站点资源梳理 -
julyboxer:
要买的书http://product.dangdang.com ...
B2C网络站点资源梳理
V get(Object key, int hash) { if (count != 0) { // read-volatile HashEntry e = getFirst(hash); while (e != null) { if (e.hash == hash && key.equals(e.key)) { V v = e.value; if (v != null) return v; return readValueUnderLock(e); // recheck } e = e.next; } } return null; } |
V readValueUnderLock(HashEntry e) { lock(); try { return e.value; } finally { unlock(); } } |
put 操作一上来就锁定了整个segment,这当然是为了并发的安全,修改数据是不能并发进行的,必须得有个判断是否超限的语句以确保容量不足时能够 rehash,而比较难懂的是这句int index = hash & (tab.length - 1),原来segment里面才是真正的hashtable,即每个segment是一个传统意义上的hashtable,如上图,从两者的结构就可以看 出区别,这里就是找出需要的entry在table的哪一个位置,之后得到的entry就是这个链的第一个节点,如果e!=null,说明找到了,这是就 要替换节点的值(onlyIfAbsent == false),否则,我们需要new一个entry,它的后继是first,而让tab[index]指向它,什么意思呢?实际上就是将这个新entry 插入到链头,剩下的就非常容易理解了。
V put(K key, int hash, V value, boolean onlyIfAbsent) { V oldValue; |
remove 操作非常类似put,但要注意一点区别,中间那个for循环是做什么用的呢?(*号标记)从代码来看,就是将定位之后的所有entry克隆并拼回前面去, 但有必要吗?每次删除一个元素就要将那之前的元素克隆一遍?这点其实是由entry的不变性来决定的,仔细观察entry定义,发现除了value,其他 所有属性都是用final来修饰的,这意味着在第一次设置了next域之后便不能再改变它,取而代之的是将它之前的节点全都克隆一次。至于entry为什 么要设置为不变性,这跟不变性的访问不需要同步从而节省时间有关,关于不变性的更多内容,请参阅之前的文章《线程高级---线程的一些编程技巧》
V remove(Object key, int hash, Object value) { V oldValue = null; |
static final class HashEntry { HashEntry(K key, int hash, HashEntry next, V value) { |
以上,分析了几个最简单的操作,限于篇幅,这里不再对rehash或iterator等实现进行讨论,有兴趣可以参考src。
接下来实际上还有一个疑问,ConcurrentHashMap跟HashMap相比较性能到底如何。这在Brian Goetz的文章中已经有过评测http://www.ibm.com/developerworks/cn/java/j-jtp07233/ 。
发表评论
-
网页设计步骤
2010-04-20 15:37 919第1章 用户体验为什么如此重要 日常生活中的遭遇 什么 ... -
Unix的5种I/O模型
2009-03-30 16:00 30631、阻塞I/O 2、非阻塞I/O ... -
使用异步 I/O 大大提高应用程序的性能
2009-03-30 15:21 1176http://www.ibm.com/developerwor ... -
WSAD环境下JMS异步通信全攻略
2009-03-18 12:03 747http://tech.ccidnet.com/art/981 ... -
java线程的缺陷
2009-03-14 21:59 1185Java 编程语言的线程模型可能是此语言中最薄弱的部分。它完 ... -
Java NIO类库Selector机制解析
2009-03-02 11:45 1849Java NIO 类库 Selector ... -
Java远程通讯可选技术及原理
2009-02-23 11:07 937在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的, ... -
AOP 的利器:ASM 3.0 介绍
2009-02-13 14:05 11802007 年 7 月 25 日 随着 AOP(Aspec ... -
JVM小记2
2009-01-17 16:03 933JVM执行引擎: 方法 ... -
JVM小记
2009-01-08 15:33 991JVM内存分布 方法区:包 ... -
socket, nio socket 及nio socket框架MINA总结
2008-12-21 15:03 3170最近花了点时间研究了一下nio,及其开源框架MINA,现把心得 ... -
大型网站架构分析收集
2008-11-26 22:17 2065. PlentyOfFish 网站架构学习 http://ww ... -
java深度clone
2008-11-14 14:47 1297public Object deepClone() ... -
20081107总结
2008-11-08 17:03 855今天是一个特别的 ... -
JAVA中的指针,引用及对象的clone
2008-09-04 19:22 825Java语言的一个优点就是取消了指针的概念,但也导致了许多程序 ... -
weblogic 9 远程调试
2008-07-11 17:22 1357在startWebLogic.cmd中加入 set JAVA_ ... -
JVM调优总结
2008-07-09 19:55 1150http://pengjiaheng.spaces.live. ... -
JFreeChart增强JSP报表的用户体验 (精品 )
2008-05-27 22:17 1025http://tech.it168.com/j/2007-09 ... -
Java是传值还是传引用
2008-05-27 10:09 9371. 简单类型是按值传递的 Java 方法的参数是简单类 ... -
WebWork标签库分为七大类:
2008-05-22 13:23 1696WebWork标签库分为七大类: 通用标签: 最常用, 最基本 ...
相关推荐
程序员面试加薪必备_ConcurrentHashMap底层原理与源码分析深入详解
源码分析见我博文:http://blog.csdn.net/wabiaozia/article/details/50684556
在本文中,我们将深入探索 ConcurrentHashMap 的高并发实现机制,并分析其在 Java 内存模型基础上的实现原理。了解 ConcurrentHashMap 的实现机制有助于我们更好地理解 Java 并发编程的原理和技术。 一、Java 内存...
分析JDK源代码,探索ConcurrentHashMap高并发的具体实现机制,包括其在JDK中的定义和结构、并发存取、重哈希和跨段操作,并着重剖析了ConcurrentHashMap读操作不需要加锁和分段锁机制的内在奥秘和原理。
通过以上分析可以看出,`ConcurrentHashMap`的设计非常巧妙,它利用锁分离技术和不可变性来实现高效的并发访问。这种设计不仅提高了多线程环境下的性能,同时也保持了良好的线程安全性。对于需要在多线程环境下高效...
本文将对ConcurrentHashMap#put方法的源码进行详细分析,从而帮助读者更好地理解ConcurrentHashMap的工作机理。 一、ConcurrentHashMap的底层原理 ConcurrentHashMap是基于哈希表实现的,可以存储大量的数据。其...
综上所述,"ConcurrentHashMap共18页.pdf.zip"这份文档很可能是深入分析 ConcurrentHashMap 的详细指南,涵盖了其设计原理、实现机制以及最佳实践。如果你对并发编程或者Java集合框架有深入需求,这份资料将是一份...
【源码分析】深入理解`ConcurrentHashMap`的工作原理,需要查看其源码,特别是`put`、`get`、`resize`等关键操作,以及在不同版本中的变化,例如Java 8引入的红黑树优化。 总结,`ConcurrentHashMap`是Java并发编程...
在`ConcurrentHashMap`的源码分析中,可以看到它通过`volatile`关键字保证了`HashEntry`中`value`字段的可见性,确保了读操作的正确性,而其他字段如`key`、`hash`和`next`都是`final`的,防止在链表中进行中间插入...
只是都是相通的,当我们了解了ConcurrentHashMap的实现原理以及各个方法的实现机制,我们对于其他的hash类型实现也能快速的理解,今天我们就来通过源码来一点一点的分析下ConcurrentHashMap的实现。 首先我们来看...
在HashMap源码分析中,我们可以看到HashMap类中的一些关键属性,如transient Entry[] table;、transient int size;、int threshold;、final float loadFactor;、transient int modCount;等等,这些属性都是HashMap...
本文将深入分析`ConcurrentHashMap`的设计原理、性能特点以及常见使用场景,帮助你提升Java并发编程的技能。 `ConcurrentHashMap`是`java.util.concurrent`包下的一个类,它在`HashMap`的基础上进行了优化,以适应...
现在我们来详细分析HashMap的工作机制: 1. **存储操作**:当我们调用`put()`方法插入键值对时,HashMap首先计算键的哈希码,然后模上数组的大小,得到一个索引位置。如果该位置的链表为空,就直接创建一个新的链表...
本文主要讲述了 Java 中的并发编程,包括 atomic 包的介绍、CAS 算法的原理、ABA 问题的解决方案,以及 collections 中的 HashMap、HashTable 和 ConcurrentHashMap 的源码分析。 Atomic 包的介绍 ----------------...
6. **阻塞队列BlockingQueue**:`14-阻塞队列BlockingQueue实战及其原理分析二-fox`讲解了阻塞队列的概念。 BlockingQueue是一种特殊的队列,当队列满时,生产者线程会被阻塞;队列空时,消费者线程会被阻塞。这种...
ConcurrentHashMapConcurrentHashMap底层具体实现JDK1.7底层实现将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。ConcurrentHashMap...
6. 客户端 socket 连接上专门监听消息的线程收到消息,分析结果,取到 ID,再从前面的 ConcurrentHashMap 里面 get(ID),从而找到 callback,将方法调用结果设置到 callback 对象里。 客户端获取结果 7. 监听线程...
ConcurrentHashMap理论概述,实现原理,简单的源码分析,put和get的简单学习
03-并发List、Set、 ConcurrentHashMap底层原理剖析-monkey 04-Java并发线程池底层原理详解与源码分析-monkey 05-并发编程之深入理解Java线程-fox 06-并发编程之CAS&Atomic原子操作详解-fox 07-并发锁机制之深入理解...