- 浏览: 290467 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
lsy812198178:
写的很好,有收获
Java内部类的作用 -
JsonLiangyoujun:
关于第四点,同时继承一个类和实现一个接口的话,重写的应该是父类 ...
Java内部类的作用 -
chenluhe123:
非常感谢楼主分享,浅显易懂
Java内部类的作用 -
唐予之.:
学有所获,非常感谢
Java内部类的作用 -
o22221234:
...
Java内部类的作用
http://blog.sina.com.cn/s/blog_605f5b4f0100qsij.html
曾经研究过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
发表评论
-
大数据量,海量数据 处理方法总结
2011-09-15 16:38 1028大数据量的问题是很多面试笔试中经常出现的问题,比如baidu ... -
讲的很详细很透彻的多态性
2011-09-08 11:10 989http://zhidao.baidu.com/questio ... -
qsort应用于指针数组与二维数组(字符)的差异
2011-09-03 15:37 1525http://www.cppblog.com/Joe/arch ... -
c++位运算与类型字节数
2011-09-02 23:51 1310http://www.cnblogs.com/thujason ... -
struct和typedef struct
2011-08-26 13:58 1123http://www.kuqin.com/language/2 ... -
shell sed一次简单的应用
2011-08-25 11:42 1022#!/bin/bash for i in 12 14 16 ... -
c++关键字explicit使用指南
2011-08-24 16:12 1329http://tech.e800.com.cn/article ... -
简介 const 与 static 的全部用法
2011-08-24 16:04 1121http://blog.csdn.net/newstudent ... -
gtest小试 第一个makefile
2011-08-22 19:04 3117gtest编译: http://www.linuxidc ... -
c++文件按行拆分
2011-08-18 13:58 1501void splitFile() { int fi ... -
GCC出现warning: integer constant is too large for 'long' type"
2011-08-15 02:07 2178The warning message can be safe ... -
第一个c多线程
2011-08-15 02:06 929#include <stdio.h> #incl ... -
time,gettimeofday,clock_gettime,_ftime
2011-08-14 21:08 2267http://blog.csdn.net/sunlylorn/ ... -
C++ Primer
2011-08-07 14:35 12172011.8.7 头文件通过inclue预 ... -
Java的代理模式(通过公共接口实现)
2011-07-28 01:21 757Java的代理模式(通过公共接口实现) htt ... -
HttpServer/HttpClient学习
2011-07-22 21:00 1074http://tech.163.com/tm/030531/0 ... -
violate
2011-06-30 00:57 2023Java中volatile关键字原 ... -
Java中获取键盘输入值
2011-06-30 00:22 1012http://www.tarena.com.cn/beijin ... -
网站前端和后台性能优化的34条经验和方法
2011-06-08 19:07 1001http://www.cnblogs.com/yan5lang ... -
Spring依赖注入
2011-06-04 18:45 1010http://blog.csdn.net/ingenuus/a ...
相关推荐
### Java源码剖析-ConcurrentHashMap #### 一、概述 `ConcurrentHashMap`是Java并发包(`java.util.concurrent`)中的一个重要组成部分,它提供了一个线程安全的哈希表实现。与传统的`Hashtable`相比,`...
java本地缓存ConcurrentHashMap
Java并发编程中的ConcurrentHashMap是HashMap的一个线程安全版本,设计目标是在高并发场景下提供高效的数据访问。相比HashTable,ConcurrentHashMap通过采用锁分离技术和更细粒度的锁定策略来提升性能。HashTable...
在JDK 1.8版本中,`ConcurrentHashMap`中的`computeIfAbsent`方法存在一个潜在的死循环问题。这个bug主要出现在并发操作时,当`ConcurrentHashMap`需要进行扩容并且`computeIfAbsent`正在执行计算的过程中,可能会...
Java利用ConcurrentHashMap实现本地缓存demo; 基本功能有缓存有效期、缓存最大数、缓存存入记录、清理线程、过期算法删除缓存、LRU算法删除、获取缓存值等功能。 复制到本地项目的时候,记得改包路径哦~
在Java编程语言中,`HashMap`和`ConcurrentHashMap`是两种非常重要的数据结构,它们都属于`java.util`包,用于存储键值对。本文将深入解析这两个类在Java 7和8版本中的实现原理、特点以及使用场景。 首先,`HashMap...
ConcurrentHashMap#put方法源码解析 ConcurrentHashMap是Java并发编程中的一个重要组件,用于解决高并发情况下的数据存储问题。在面试中,ConcurrentHashMap的底层原理、put方法的实现细节都是高频考点。本文将对...
在Java 7和8中,HashMap和ConcurrentHashMap是两种重要的数据结构,分别用于非线程安全和线程安全的键值对存储。本篇文章将深入解析这两种数据结构的内部实现,帮助读者理解它们的工作原理。 HashMap是Java中最常用...
`ConcurrentHashMap`是Java并发编程中非常重要的一个数据结构,它是线程安全的HashMap实现。在理解`ConcurrentHashMap`的实现原理之前,我们先来看看哈希表的基本概念。 哈希表是一种键值对存储的数据结构,通过键...
### ConcurrentHashMap源码剖析 #### 一、概述与背景 ConcurrentHashMap是Java中提供的一种高效、线程安全的哈希表实现。与传统的基于synchronized关键字实现线程安全的HashTable相比,ConcurrentHashMap通过采用...
在Java并发编程中,ConcurrentHashMap是一个重要的并发集合。它是由Doug Lea在JSR166y中引入,并在Java 5中提供的一种线程安全的HashMap实现。与传统的HashMap相比,ConcurrentHashMap在多线程环境下具有更好的性能...
程序员面试加薪必备_ConcurrentHashMap底层原理与源码分析深入详解
ConcurrentHashMap 的实现原理 ConcurrentHashMap 是 Java 中一个高效的线程安全的哈希表实现,它的实现原理可以分为两部分:JDK1.7 中的实现和 JDK8 中的实现。 JDK1.7 中的实现 在 JDK1.7 中,...
在Java的并发编程中,ConcurrentHashMap 是一个非常重要的组件,它提供了线程安全的HashMap实现。本文将深入探讨 ConcurrentHashMap 的内部实现原理,并通过代码示例展示其使用方法和优势。 通过本文,我们深入探讨...
### Java并发编程之ConcurrentHashMap #### 一、概述 `ConcurrentHashMap`是Java并发编程中的一个重要组件,它提供了一种线程安全的哈希表实现方式。与传统的`Hashtable`或`synchronized`关键字相比,`...
ConcurrentHashMap是J.U.C(java.util.concurrent包)的重要成员,它是HashMap的一个线程安全的、支持高效并发的版本。在默认理想状态下,ConcurrentHashMap可以支持16个线程执行并发写操作及任意数量线程的读操作。...
【标题】"ConcurrentHashMap共18页.pdf.zip" 提供的资料主要聚焦于Java并发编程中的重要数据结构——`ConcurrentHashMap`。这个压缩包包含了一份18页的PDF文档,很可能详细阐述了`ConcurrentHashMap`的设计原理、...