- 浏览: 443622 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
g_man1990:
update config 不成功啊
build-helper-maven-plugin 配置多 source resource 文件 -
netwelfare:
文章很详细,就是太长了,读起来有点困难,倒不如写精练点,像这篇 ...
Java 基本类型 -
huyuancai1010:
function commitForm() {
var ...
加时间戳或者随机数去除js缓存 -
Smile__:
不过这个东西以前还真没研究过 。
hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size -
Smile__:
想不到你也是北大青鸟的 。哈
hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size
关键字: 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) { |
以上,分析了几个最简单的操作,限于篇幅,这里不再对rehash或iterator等实现进行讨论
发表评论
-
StringBuStringffer 和 StringBuilder 区别
2010-02-05 17:37 1388String 字符串常量 StringBuffer 字符串变量 ... -
Java timezone
2010-01-13 20:57 1679转自:行者买刀 获得java时间时,突然获得的时间不是当前 ... -
Javap
2010-01-04 10:07 3736javap是jdk自带的一个工具,可以反编译,也可以查看jav ... -
JAVA 主动调用与被动调用
2009-12-31 13:54 2293public class Test { stati ... -
Java解析XML文件的方法比较
2009-12-24 17:14 13401)DOM(JAXP Crimson解 ... -
Java 遍历二叉树
2009-12-18 17:13 1983Binary.java import java.util.S ... -
Java protected
2009-12-16 15:17 4741(1)除了在(2)中表 ... -
SimpleDateFormat 参数 Z
2009-12-11 17:20 1683import java.text.SimpleDate ... -
HashMap 详解
2009-12-04 14:30 1413Hashmap是一种非常常用的、应用广泛的数据类型,最近研究到 ... -
JAVA自动装箱与拆箱
2009-11-24 17:15 1644自动装箱与拆箱的功能事实上是编译器来帮您的忙,编译器在编译时期 ... -
String java
2009-11-24 16:29 1439众所周知,String是由字符组成的串,在程序中使用频率很高。 ... -
Java 动态绑定
2009-09-08 11:45 1496代码: public class Par ... -
JAVA虚拟机命令行参数
2009-08-18 15:51 1983一、运行class文件执行带main方法的class文件,命令 ... -
Collections.sort
2009-07-03 16:59 1690第一种方法:容器内要排序的类必须时下Comparable接口: ... -
java 多态 例子
2009-06-30 21:58 2673其实也就是两种绑定状态:动态绑定(也称后期绑定),静态绑定(也 ... -
Java 字节 字符 字符串
2009-06-23 10:07 5999String的length()方法和数组的length属性 S ... -
Java 运算符 详解
2009-06-23 09:59 2137有些运算符在JAVA语言中存在着,但是在实际开发中我们或许很少 ... -
Java 面试题 经典
2009-06-22 16:42 1676请下载见附件~~~ -
Java 基本类型
2009-06-22 16:39 32279基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型。它 ... -
java 传值 传引用
2009-06-22 16:18 1767JAVA中的传递都是值传递吗?有没有引用传递呢? 在回答这两个 ...
相关推荐
ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的...
这时候ConcurrentHashMap达到容量扩容而忽略了ReservationNode情况,调用put的时候在synchronized(f)没有对ReservationNode处理,所以会出现死循环。 在jdk1.8和1.9中对比 http://gee.cs.oswego.edu/cgi- bin/...
Java利用ConcurrentHashMap实现本地缓存demo; 基本功能有缓存有效期、缓存最大数、缓存存入记录、清理线程、过期算法删除缓存、LRU算法删除、获取缓存值等功能。 复制到本地项目的时候,记得改包路径哦~
java源码剖析-ConcurrentHashMap
程序员面试加薪必备_ConcurrentHashMap底层原理与源码分析深入详解
java7-8中的 HashMap和ConcurrentHashMap全解析
ConcurrentHashMap的实现原理(JDK1.7和JDK1.8),并说明了在jdk1.7与jdk1.8的不同实现原理
ConcurrentHashMap源码剖析
java7-8中的 HashMap和ConcurrentHashMap全解析 如果你想了解底层的逻辑就来看看吧
ConcurrentHashMap是J.U.C(java.util.concurrent包)的重要成员,它是HashMap的一个线程安全的、支持高效并发的版本。在默认理想状态下,ConcurrentHashMap可以支持16个线程执行并发写操作及任意数量线程的读操作。...
高薪程序员面试题精讲系列49之说说ConcurrentHashMap#put方法的源码及数。。。.pdf,这是一份不错的文件
ConcurrentHashMap具体是怎么实现线程安全的呢,肯定不可能是每个方法加synchronized,那样就变成了HashTable。
解析concurrenthashmap的源码,学习多线程的思想
ConcurrentHashMap使用了分段锁(Segment)来实现并发的读写操作,每个Segment都相当于一个小的HashMap,将整个哈希表分成多个部分。这样可以同时进行多个线程的并发读写操作,不会阻塞其他线程的访问。 需要注意的...
源码分析见我博文:http://blog.csdn.net/wabiaozia/article/details/50684556
Java并发编程之ConcurrentHashMap Java并发编程之ConcurrentHashMap.pdf
java本地缓存ConcurrentHashMap
Java——并发容器之ConcurrentHashMap;Java——并发容器之ConcurrentHashMap;Java——并发容器之ConcurrentHashMap;Java——并发容器之ConcurrentHashMap;Java——并发容器之ConcurrentHashMap;Java——并发...
ConcurrentHashMap是一个线程安全的HashTable,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法。ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的...
NULL 博文链接:https://107192468a.iteye.com/blog/2296911