- 浏览: 448602 次
- 性别:
- 来自: 长沙
文章分类
- 全部博客 (168)
- Hibernate (17)
- MySQL (7)
- struts2 (14)
- Spring (12)
- Javascript (20)
- CSS (8)
- ajax/jquery (11)
- HttpClient (6)
- HTTP (1)
- java小知识 (23)
- Servlet/JSP (5)
- Oracle (0)
- Quartz (3)
- Lucene/Nutch (12)
- c# winform (2)
- J2ME (1)
- POI (5)
- php5 (2)
- DWR(Ajax) (1)
- log4j (1)
- dom4j (3)
- 獲取郵件聯系人 (2)
- 随意 (5)
- Heritrix (1)
- ireport+jasper (1)
- 算法 (2)
- java虚拟机 (1)
- maven (2)
最新评论
-
janrick:
太感谢了,我正需要加密的函数呢
java中DES加密解密例子 -
xuganggogo:
suyang119 写道请教一下,补充的三级的可以用吗?当然可 ...
关于条件查询detachedCriteria的注意的地方 -
suyang119:
请教一下,补充的三级的可以用吗?
关于条件查询detachedCriteria的注意的地方 -
xuganggogo:
大江帅 写道var name="attriName& ...
有关在JavaScript中使用EL表达式的问题 -
大江帅:
var name="attriName"; ...
有关在JavaScript中使用EL表达式的问题
曾经研究过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) { |
以上,分析了几个最简单的操作,限于篇幅,这里不再对rehash或iterator等实现进行讨论,有兴趣可以参考src。
接下来实际上还有一个疑问,ConcurrentHashMap跟HashMap相比较性能到底如何。这在Brian Goetz的文章中已经有过评测http://www.ibm.com/developerworks/cn/java/j-jtp07233/ 。
引:http://blog.csdn.net/liuzhengkang/archive/2008/09/12/2916620.aspx
发表评论
-
正则替换标点符号的方法。解决方式还不错
2011-01-28 11:08 3297地址:http://topic.csdn.net/u/2008 ... -
hadoop环境搭建问题记录
2010-10-12 17:11 12651,错误 org.apache.hadoop.hdfs.se ... -
Java 正则表达式
2010-07-16 11:52 13451. 正则表达式规则 1.1 普通字符 字母、数字 ... -
字符串转换为Date
2010-04-24 11:04 1746查看了下SimpleDateFomart这个类。 用字符串转 ... -
正则表达式替换掉字符串中的重复字符
2009-12-11 17:51 2350str = str.replaceAll("( ... -
JFreeChart 部分API说明
2009-08-15 11:55 962http://amozon.iteye.com/blog/ ... -
反编译工具
2009-08-14 14:46 1213jad及常用命令 一、基本用法 Usage:jad ... -
JFreeChart
2009-08-10 18:35 11951,柱状图 package xu.chart.demo; ... -
java生成缩略图
2009-07-17 11:02 2356转自:http://wing929.iteye.com/blo ... -
jstl 时间处理
2009-06-24 14:06 1605jstl 中的日期格式化! [转贴 2005-10-25 1 ... -
Java Properties类
2009-05-31 14:26 2114全文转自:http://twtmnm1314.iteye.co ... -
java 的pass by value(传值)
2009-05-13 15:21 1174这里写一下java的值传递 参数是基本类型的时候: cla ... -
快速修改本機局域網IP信息
2009-05-09 13:07 2065在開發過程中,遇到需要頻繁的切換IP的問題。每次手動修改IP需 ... -
double:保留几位小数点
2009-03-06 10:03 2302java.text.DecimalFormat myforma ... -
增加环境内存--java
2009-02-13 14:50 1032在eclipse中,在虚拟机环境变量VM arguments中 ... -
javaIO流读繁体中文网页的乱码问题
2009-02-01 17:09 1633IDE:eclipse IDE的编码是UTF-8(开发需要) ... -
学习java.lang.ProcessBuilder类
2009-02-01 17:08 5515近来的工作中,了 ... -
java中DES加密解密例子
2009-02-01 17:07 4220最近在学习一些关于加 ... -
Servlets/JSP开发技术问答
2009-02-01 17:06 956学习J2EE,需要学习很多 ... -
JAVA实现在图片上写文字
2009-02-01 17:05 4901功能:直接在一张已有的图片上写字,可指定文字颜色。 ...
相关推荐
JDK1.5,也被称为Java SE 5.0(Java Standard Edition 5.0),是Sun Microsystems在2004年发布的一个重要版本,引入了许多关键性的新特性和改进,对于Java的发展具有里程碑式的意义。 首先,JDK1.5最重要的特性之一...
这份《JDK 1.5中文帮助文档》包含了所有这些特性的详细解释,以及API的完整参考,是开发者学习和查阅Java 1.5特性的必备资料。无论你是初学者还是经验丰富的开发者,都可以从中受益匪浅,提高编程效率,编写出更加...
JDK 1.5版本的API中文文档,覆盖了该版本引入的新特性和更新内容,对于学习Java SE 5.0至关重要。 1. **Java核心技术** - **基础类库**:包括`java.lang`、`java.util`和`java.io`等核心包,涵盖了基本数据类型、...
JDK1.5,也被称为JDK5,是Java历史上的一个关键版本,它在2004年发布,引入了大量的新特性和改进,对Java编程语言产生了深远的影响。在这个版本中,Java进行了许多现代化的改革,旨在提高开发效率,增强类型安全,并...
【JDK1.5新特性】 1. 泛型(Generic) JDK1.5引入了泛型,这是对类型安全的重要改进。泛型允许在集合类中指定元素的类型,确保了在编译时就能进行类型检查,避免了运行时的强制类型转换和可能的ClassCastException...
#### JDK1.5 新特性 JDK1.5,也称为Java 5,是Java发展史上的一个重要里程碑,引入了许多新特性,极大地提高了开发效率和代码质量。这些新特性包括: 1. **泛型** - 泛型是一种在编译时检查类型安全,并且所有的...
在1.6版本的手册中,你可以找到关于新的并发工具类(如`ConcurrentHashMap`和`Phaser`)的详细解释,以及改进的I/O流和NIO(非阻塞I/O)的介绍。而在1.5版本的手册中,理解泛型的工作原理和如何有效利用枚举来替换...
1. **Java语言特性**:JDK 1.5(也称为Java SE 5.0)引入了一些重大的语言改进,包括: - **泛型(Generics)**:泛型增加了类型安全,允许在编译时检查类型,避免了运行时的ClassCastException。 - **枚举(Enums...
7. **JDK 版本特性**: JDK 1.5 引入了枚举、匿名内部类、自动装箱/拆箱等特性;JDK 1.7 引入了钻石操作符、try-with-resources 等;JDK 1.8 包括 Lambda 表达式、接口的默认方法和静态方法、Stream API 等。 8. **...
JDK 1.5于2004年发布,引入了许多重要的新特性,包括: - **泛型(Generics)**:泛型允许在类、接口和方法中定义类型参数,提高了代码的类型安全性。 - **枚举(Enums)**:增强了对常量集合的支持,使得枚举...
Java JDK(Java Development Kit)是Java编程语言的软件开发工具包,它包含了编译、调试、运行Java程序所需的所有...对于其他如JDK1.5、1.6、1.7版本的需求,虽然没有直接提供,但可以通过搜索或访问相关资源站点获取。
JDK 1.5,也被称为Java SE 5.0,是一个里程碑式的版本,于2004年发布,引入了一系列重要的新特性和改进,为Java开发者带来了显著的生产力提升。 1. **泛型(Generics)** 泛型是Java 5中的核心特性之一,它允许在...
对于Java开发者来说,JDK 1.5(也称为Java 5.0)引入了许多重要的新特性,包括泛型、枚举类型、匿名内部类的改进、注解(Annotation)以及增强的for循环(foreach)。这些改进提高了代码的类型安全性、可读性和可...
本文将详细总结JDK 1.5到1.7之间的重要新特性。 ### JDK 1.5(也称为Java 5.0) #### 1. Generics(泛型) 泛型是Java 5.0中的重大更新,它允许在类、接口和方法声明中使用类型参数,提高了代码的类型安全性和重用...
JDK 1.8是Java开发工具包的一个重要版本,它引入了许多新特性和优化,增强了Java编程语言的功能和效率。以下是一些关键知识点: 1. **Lambda表达式**:这是JDK 1.8最重要的特性之一,它提供了一种简洁的方式来表示...
JDK 1.8对并发集合类进行了优化,如`ConcurrentHashMap`,引入了新的Fork/Join框架和Parallel Stream,提升了多线程环境下的性能。 #### 1.6 Nashorn JavaScript引擎 JDK 1.8内置了Nashorn JavaScript引擎,允许...
- **泛型**:在JDK 1.5引入,但在1.6中得到进一步完善,泛型允许开发者在类型安全的情况下操作集合,减少类型转换错误。 - **增强的for循环(foreach)**:简化了遍历数组和集合的操作。 - **动态代理**:提供了创建...
1. **增强的性能**:JDK 1.6在1.5的基础上进行了许多性能优化,包括对垃圾回收机制的改进,提升了应用程序的运行效率。 2. **改进的内存管理**:这个版本引入了更精细的堆内存分区,有助于减少内存碎片,提高大型...
JDK 1.6是Java的一个重要版本,发布于2006年,它在JDK 1.5的基础上增加了一些新特性,改进了性能,并修复了大量已知问题。API(Application Programming Interface)是JDK的核心部分,提供了丰富的接口和类,供...