专栏首页Java小王子与Hashtable比较get方法和clear方法
原创

与Hashtable比较get方法和clear方法

与Hashtable比较

  由于Hashtable无论是读还是写还是遍历,都需要获得对象锁,串行操作,因此在多线程环境下性能比较差。   但是ConcurrentHashMap不能完全取代Hashtable:HashTable的迭代器是强一致性的,而ConcurrentHashMap是弱一致的。其实 ConcurrentHashMap的get,clear,iterator 都是弱一致性的。 Doug Lea 也将这个判断留给用户自己决定是否使用ConcurrentHashMap。   弱一致性:不保证数据完全处于一致性状态。比如:

get方法:

可能在get的时候获得一个还没完全构造好的HashEntry对象,导致获得的entry的value为null,此时需要加锁重新读取。

clear方法

public void clear() {
	for (int i = 0; i < segments.length; ++i)
		segments[i].clear();
}

  因为没有全局的锁,在清除完一个segments之后,正在清理下一个segments的时候,已经清理segments可能又被加入了数据,因此clear返回的时候,ConcurrentHashMap中是可能存在数据的。因此,clear方法是弱一致的。

迭代器

   java.util 包中的集合类都返回 fail-fast 迭代器,这意味着它们假设线程在集合内容中进行迭代时,集合不会更改它的内容。如果 fail-fast 迭代器检测到在迭代过程中进行了更改操作,那么它会抛出 ConcurrentModificationException。    ConcurrentHashMap中的迭代器主要包括entrySet、keySet、values方法。它们大同小异,这里选择entrySet解释。当我们调用entrySet返回值的iterator方法时,返回的是EntryIterator,在EntryIterator上调用next方法时,最终实际调用到了HashIterator.advance()方法,看下这个方法:

final void advance() {
    if (nextEntry != null && (nextEntry = nextEntry.next) != null)
        return;
 
    while (nextTableIndex >= 0) {
        if ( (nextEntry = currentTable[nextTableIndex--]) != null)
            return;
    }
 
    while (nextSegmentIndex >= 0) {
        Segment<K,V> seg = segments[nextSegmentIndex--];
        if (seg.count != 0) {
            currentTable = seg.table;
            for (int j = currentTable.length - 1; j >= 0; --j) {
                if ( (nextEntry = currentTable[j]) != null) {
                    nextTableIndex = j - 1;
                    return;
                }
            }
        }
    }
}

  在这种迭代方式中,比如我们删除了链表的某个entry,但是在完成之前,迭代器获得了旧的链表指针,那么就会遍历旧的链表,并且不会报异常。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

关注作者,阅读全部精彩内容

我来说两句

0 条评论
登录 后参与评论

相关文章

  • HTTP 方法:GET方法 对比 POST方法

    Http请求中的get方法和post方法的异同,算是我们Web开发时候常见的问题吧,这次还是老生常谈,新壶装旧酒,权当复习了。

    浩Coding
  • HTTP方法之GET与POST对比

    超文本传输协议(HTTP)的设计目的是保证客户端与服务器之间的通信。最常用的是GET与POST   1.GET方法:     查询字符串(键/值对)是在GET...

    用户1149564
  • JS方法比较

    Object.keys 返回一个所有元素为字符串的数组,其元素来自于从给定的object上面可直接枚举的属性。这些属性的顺序与手动遍历该对象属性时的一致。

    愤怒的小鸟
  • HashMap及HashTable源码解析

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

    程序员徐公
  • HTTP 方法:GET 对比 POST

    三哥
  • HTTP 方法:GET 对比 POST

    举例:客户端(浏览器)向服务器提交 HTTP 请求;服务器向客户端返回响应。响应包含关于请求的状态信息以及可能被请求的内容。

    流柯
  • Hashtable 的实现原理

      当串行化某个对象时,如果该对象的某个变量是transient,那么这个变量不会被串行化进去。也就是说,假设某个类的成员变量是transient,那么当通...

    全栈程序员站长
  • java StringBuffer的length()和capacity()方法比较

    StringBuffer类和String类差不多,都是字符串类,只是StringBuffer在对字符串进行修改时不会生成新的对象,所以效率相对较高,占用空间也小...

    用户7886150
  • pandas:apply和transform方法的性能比较

    都能针对dataframe完成特征的计算,并且常常与groupby()方法一起使用。

    Bo_hemian
  • 周末晚上回来写的HashTable源码分析

    其实,这些方法分析下来,难度是有的,但是整体分析下来还是比较值得的,如果我自己只分析,不记录文字输出出来应该很快就会分析完,内容输出来确实可以帮助自己一些,如果...

    码农王同学
  • BTA 常问的 Java基础40道常见面试题及详细答案

    最近看到网上流传着,各种面试经验及面试题,往往都是一大堆技术题目贴上去,而没有答案。

    搜云库
  • PIL.Image.open和cv2.imread的比较与相互转换的方法

    PIL.Image.open读入的是RGB顺序,而opencv中cv2.imread读入的是BGR通道顺序 。cv2.imread会显示图片更蓝一些。

    砸漏
  • get和remove方法展示

    get方法的实现就是计算key的hash值,然后通过getNode获取对应的value

    用户1503405
  • jQuery - AJAX get() 和 post() 方法

    jQuery get() 和 post() 方法用于通过 HTTP GET 或 POST 请求从服务器请求数据。

    陈不成i
  • JAVA笔试题汇总(价值)

    一. Java基础部分................................................................. 9

    阮键
  • Java集合深度解析之Hashtable

    Hashtable简介 Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值...

    互扯程序
  • 探索和时间聚类方法比较(cs)

    时态网络的描述和动态社区的检测是近十年来的研究热点。然而,由于任务的复杂性,尚未找到对这些挑战的一致答案。静态社区不是定义良好的对象,添加时间维度使描述更加困难...

    柴艺
  • Java - 线程安全的 HashMap 实现方法及原理

    转载自 http://liqianglv2005.iteye.com/blog/2025016

    allsmallpig
  • java基础(九):容器

    Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中

    Vincent-yuan

扫码关注云+社区

领取腾讯云代金券