- 浏览: 375802 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wangchong_kevin:
放在drawable-hdpi目录下的图片,如果在mdpi分辨 ...
BitmapFactory.Options 解决加载大图片OOM -
darren_nizna:
Netty 实战(精髓) http://gitlore. ...
Java NIO框架Netty教程(一) Hello Netty(转) -
大家来学习:
国内首部NIO+Netty5各种RPC架构实战演练课程观看地址 ...
Java NIO框架Netty教程(一) Hello Netty(转) -
lipeixiaoyu:
[color=red][/color]123
IOS UIView的clipsToBounds属性 -
ramon1989:
问一下,你的SimpleChannelHandler是哪个包下 ...
Java NIO框架Netty教程(一) Hello Netty(转)
曾经研究过jkd1.5新特性,其中ConcurrentHashMap就是其中之一,其特点:效率比Hashtable高,并发性比hashmap好。结合了两者的特点。
集合是编程中最常用的数据结构。而谈到并发,几乎总是离不开集合这类高级数据结构的支持。比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap)。这篇文章主要分析jdk1.5的3种并发集合类型(concurrent,copyonright,queue)中的ConcurrentHashMap,让我们从原理上细致的了解它们,能够让我们在深度项目开发中获益非浅。
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) { |
转自:http://xuganggogo.iteye.com/blog/321630
发表评论
-
tomcat下jsp乱码原因(下)
2015-09-16 14:13 692转自:http://blog.csdn.net/jgwei/ ... -
tomcat 下jsp乱码的原因分析(上)
2015-09-16 14:10 664转自 http://blog.csdn.net/jgwei/ ... -
JAVA数据源连接方式汇总
2015-07-23 10:28 825一、问题引入 在java程序中,需要访问数据库,做增删改查 ... -
java初始化块和构造方法的执行顺序
2015-06-09 11:18 639初始化块是ja ... -
Java 内存分配全面浅析
2014-02-20 10:56 759本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更 ... -
java 24小时和12小时制
2013-04-12 11:39 1192Date类,已经很少用了。用Calendar吧。 Calen ... -
BlockingQueue
2013-04-08 12:07 983前言: 在新增的Concu ... -
Java NIO框架Netty教程(四) ChannelBuffer(转)
2013-03-01 10:34 8083在学字符串消息收发(ht ... -
Java NIO框架Netty教程(三) 字符串消息收发(转)
2013-03-01 10:31 6346了解了Netty的基本概念( ... -
Java NIO框架Netty教程(二) 白话概念(转)
2013-03-01 10:20 7824"Hello World"的代 ... -
Java NIO框架Netty教程(一) Hello Netty(转)
2013-03-01 10:16 48803先啰嗦两句,如果你还不知道Netty是做什么的能做什么。那 ... -
Netty Channel 接口名词理解
2013-02-28 18:56 29181.Channel channel 是负责数据读,写的对象 ... -
Java中使用默认的密钥库和算法创建数字证书
2012-11-15 09:42 1176★ 实例说明 本实例使 ... -
keystore提取私钥和证书
2012-11-15 09:41 1970keytool -genkey -alias test -ke ... -
详细讲KeyTool
2012-11-15 09:39 1★ 实例说明 本实例使用J2SDK提供的keytool工具 ... -
http获取文件大小
2012-09-21 10:03 2070URL url = new URL(downloadUrl); ... -
android内存管理
2012-03-16 10:56 1很多开发者都是从j2me或j2ee上过来的,对于内存的使用和理 ... -
Playing Flash FLV Videos in Android applications
2012-03-14 14:37 1650Often when you create an app di ... -
调用Android系统“应用程序信息(Application Info)”界面
2012-02-21 18:45 0“Android系统设置->应 ... -
AsyncTask解决Android UI堵塞问题
2012-02-17 14:54 0AsyncTask解决Android UI堵 ...
相关推荐
1. **分段锁技术**:`ConcurrentHashMap`内部采用了分段锁(Segment)的机制来减少锁竞争。每个`Segment`类似于一个小型的哈希表,每个`Segment`拥有自己的锁,当对`ConcurrentHashMap`进行写操作时,只需要锁定对应的...
java本地缓存ConcurrentHashMap
### ConcurrentHashMap源码剖析 #### 一、概述与背景 ConcurrentHashMap是Java中提供的一种高效、线程安全的哈希表实现。与传统的基于synchronized关键字实现线程安全的HashTable相比,ConcurrentHashMap通过采用...
Java利用ConcurrentHashMap实现本地缓存demo; 基本功能有缓存有效期、缓存最大数、缓存存入记录、清理线程、过期算法删除缓存、LRU算法删除、获取缓存值等功能。 复制到本地项目的时候,记得改包路径哦~
Java并发编程中的ConcurrentHashMap是HashMap的一个线程安全版本,设计目标是在高并发场景下提供高效的数据访问。相比HashTable,ConcurrentHashMap通过采用锁分离技术和更细粒度的锁定策略来提升性能。HashTable...
《并发编程:深入理解JDK1.8 ConcurrentHashMap》 ConcurrentHashMap是Java并发编程中不可或缺的一个数据结构,它在JDK1.8中进行了重大的优化,极大地提升了并发性能。相较于早期版本,JDK1.8的ConcurrentHashMap...
源码分析见我博文:http://blog.csdn.net/wabiaozia/article/details/50684556
在Java并发编程中,ConcurrentHashMap是一个重要的并发集合。它是由Doug Lea在JSR166y中引入,并在Java 5中提供的一种线程安全的HashMap实现。与传统的HashMap相比,ConcurrentHashMap在多线程环境下具有更好的性能...
ConcurrentHashMap 的实现原理 ConcurrentHashMap 是 Java 中一个高效的线程安全的哈希表实现,它的实现原理可以分为两部分:JDK1.7 中的实现和 JDK8 中的实现。 JDK1.7 中的实现 在 JDK1.7 中,...
在JDK 1.8版本中,`ConcurrentHashMap`中的`computeIfAbsent`方法存在一个潜在的死循环问题。这个bug主要出现在并发操作时,当`ConcurrentHashMap`需要进行扩容并且`computeIfAbsent`正在执行计算的过程中,可能会...
它基于哈希表实现,提供O(1)的平均时间复杂度进行插入、删除和查找操作。在Java 7中,`HashMap`内部由数组和链表构成,当多个键映射到同一个哈希桶时,会形成链表。如果链表过长,查询效率会降低,此时Java 8引入了...
在Java 7和8中,HashMap和ConcurrentHashMap是两种重要的数据结构,分别用于非线程安全和线程安全的键值对存储。本篇文章将深入解析这两种数据结构的内部实现,帮助读者理解它们的工作原理。 HashMap是Java中最常用...
ConcurrentHashMap#put方法源码解析 ConcurrentHashMap是Java并发编程中的一个重要组件,用于解决高并发情况下的数据存储问题。在面试中,ConcurrentHashMap的底层原理、put方法的实现细节都是高频考点。本文将对...
1. 重排序 Java 内存模型描述了程序的可能行为。编译器实现可以产生任意它喜欢的代码,只要所有执行这些代码产生的结果,能够和内存模型预测的结果保持一致。这为编译器实现者提供了很大的自由,包括操作的重排序。...
ConcurrentHashMap是J.U.C(java.util.concurrent包)的重要成员,它是HashMap的一个线程安全的、支持高效并发的版本。在默认理想状态下,ConcurrentHashMap可以支持16个线程执行并发写操作及任意数量线程的读操作。...
程序员面试加薪必备_ConcurrentHashMap底层原理与源码分析深入详解
1. **Segment**:类似于HashMap,由Entry数组和链表组成。每个Segment包含一个锁,用于控制对相应数据段的访问。 2. **内部结构**:查找元素需要两次哈希操作,第一次定位Segment,第二次定位链表头部。 3. **优势**...