• .以及JDK1.5ConcurrentHashMap新特性


    一、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

  • 相关阅读:
    virtualenv与virtualenvwrapper
    数据类型、变量定义、数据类型转换
    计算机存储单元、标识符
    html单页面中用angular js
    svn客户端访问失败,错误“请求的名称有效,但是找不到请求的类型”的解决
    php 获取某数组中出现次数最多的值(重复最多的值)与出现的次数
    数据库导入时出现“2006
    phpstorm 激活
    取消本地SVN文件夹与服务器的关联
    js实现倒计时函数
  • 原文地址:https://www.cnblogs.com/xumaodun/p/4915634.html
Copyright © 2020-2023  润新知