码迷,mamicode.com
首页 > 其他好文 > 详细

.以及JDK1.5ConcurrentHashMap新特性

时间:2015-10-27 23:37:05      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:

一、HashMap和Hashtable的区别

先看2个类的定义

技术分享

结论:可见Hashtable 继承自 Dictiionary 而 HashMap继承自AbstractMap

Hashtableput方法如下:

技术分享

注意1 方法是同步的
注意2 方法不允许value==null
注意3 方法调用了key的hashCode方法,如果key==null,会抛出空指针异常 HashMap的put方法如下

HashMapput方法如下:

技术分享

注意1 方法是非同步的
注意2 方法允许key==null
注意3 方法并没有对value进行任何调用,所以允许为null

总结:

技术分享

HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步(Collections.synchronizedMap)。

二、ConcurrentHashMap新特性

ConcurrentHashMap出现问题原因:HashMap不是线程安全的,因此多线程操作时需要格外小心。

ConcurrentHashMap新特性:效率比Hashtable高,并发性比hashmap好。结合了两者的特点。

ConcurrentHashMap如何实现线程安全:

从ConcurrentHashMap代码中可以看出,它引入了一个“分段锁”的概念,具体可以理解为把一个大的Map拆分成N个小的HashTable,根据key.hashCode()来决定把key放到哪个HashTable中。

在ConcurrentHashMap中,就是把Map分成了N个Segment,put和get的时候,都是现根据key.hashCode()算出放到哪个Segment中。

 ConcurrentHashMap中主要实体类就是三个:ConcurrentHashMap(整个Hash表),Segment(桶),HashEntry(节点)。

 get 方法:

技术分享

 

put方法put 操作一上来就锁定了整个segment,这当然是为了并发的安全,修改数据是不能并发进行的。

segment里面才是真正的hashtable,即每个segment是一个传统意义上的hashtable。

技术分享

remove方法:remove 操作非常类似put

技术分享

三、知识点扫盲

1. hashcode()eaquals()区别

一般来讲,equals方法是给用户调用的,如果你想判断2个对象是否相等,你可以重写equals方法,然后在代码中调用,就可以判断他们是否相等了。简单来讲,equals方法主要是用来判断从表面上看或者从内容上看,2个对象是不是相等。举个例子,有个学生类,属性只有姓名和性别,那么我们可以认为只要姓名和性别相等,那么就说这2个对象是相等的。

hashcode方法一般用户不会去调用,比如在hashmap中,由于key是不可以重复的,他在判断key是不是重复的时候就判断了hashcode这个方法,而且也用到了equals方法。这里不可以重复是说equals和hashcode只要有一个不等就可以了!所以简单来讲,hashcode相当于是一个对象的编码,就好像文件中的md5,他和equals不同就在于他返回的是int型的,比较起来不直观。我们一般在覆盖equals的同时也要覆盖hashcode,让他们的逻辑一致。举个例子,还是刚刚的例子,如果姓名和性别相等就算2个对象相等的话,那么hashcode的方法也要返回姓名的hashcode值加上性别的hashcode值,这样从逻辑上,他们就一致了。

2.关键字volatite 

Java 语言提供了一种稍弱的同步机制,即 volatile 变量.用来确保将变量的更新操作通知到其他线程,保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新. 当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的.

volatile 变量对所有线程是立即可见的,对 volatile 变量所有的写操作都能立即反应到其他线程之中,换句话说:volatile 变量在各个线程中是一致的,所以基于 volatile 变量的运算是线程安全的. 

四、 参考来源

1. http://blog.csdn.net/shohokuf/article/details/3932967

2. http://blog.csdn.net/wl_ldy/article/details/7228127

3. http://blog.csdn.net/xuefeng0707/article/details/40834595

4. http://www.cnblogs.com/yakun/p/3589437.html

 

.以及JDK1.5ConcurrentHashMap新特性

标签:

原文地址:http://www.cnblogs.com/xumaodun/p/4915634.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!