`
leonzhx
  • 浏览: 791814 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于ConcurrentHashMap 中位移的问题

    博客分类:
  • Java
阅读更多

拜读了GoldenDoc的大作:《Java并发编程之ConcurrentHashMap》后,有一个疑问:

 关于查找Segment位置的位操作,segment的位置由如下代码确定:

 

long u = ((h >>> segmentShift) & segmentMask);

 其中 SSHIFT 和 SBASE为静态常量,而segmentShift和segmentMask则是在构造函数中初始化的:

 

 

int sshift = 0;
int ssize = 1;
while (ssize < concurrencyLevel) {
       ++sshift;
       ssize <<= 1;
}
this.segmentShift = 32 - sshift;
this.segmentMask = ssize - 1;

 其中ssize是指的segment的个数,它是不小于concurrencyLevel的最小的2的幂,假设它是2^n,那segmentShift也就是 32-n,而segmentMask是 2^n-1。我们知道2^n-1在2进制中就是n位1,而Java的int型数据是32位。所以(h >>> segmentShift) 就是把h的最高n位移到最低n位,前32-n位为0。而segmentMask就是最低n位为1其他位为0的整数。这样(h >>> segmentShift)与(h >>> segmentShift) & segmentMask应该是一样的呀?为什么要多此一举呢?



 

 

  • 大小: 6.4 KB
  • 大小: 62 KB
  • 大小: 61.4 KB
分享到:
评论

相关推荐

    JDK1.8中ConcurrentHashMap中computeIfAbsent死循环bug.docx

    在JDK 1.8版本中,`ConcurrentHashMap`中的`computeIfAbsent`方法存在一个潜在的死循环问题。这个bug主要出现在并发操作时,当`ConcurrentHashMap`需要进行扩容并且`computeIfAbsent`正在执行计算的过程中,可能会...

    JDK1.8中ConcurrentHashMap中computeIfAbsent死循环bug问题

    JDK1.8中ConcurrentHashMap中computeIfAbsent死循环bug问题 JDK1.8中ConcurrentHashMap中computeIfAbsent方法是一个非常重要的方法,它可以让开发者在键不存在时,提供一个默认值作为回应。但是,在JDK1.8中,这个...

    java源码剖析-ConcurrentHashMap

    `ConcurrentHashMap`是Java并发包(`java.util.concurrent`)中的一个重要组成部分,它提供了一个线程安全的哈希表实现。与传统的`Hashtable`相比,`ConcurrentHashMap`具有更高的并发性能,这主要得益于它的分段锁...

    ConcurrentHashMap源码剖析

    为了避免在扩容过程中锁住整个表,ConcurrentHashMap采用了特殊的扩容机制,确保即使在扩容过程中也能支持并发读写操作。 #### 四、应用场景 **1. 多线程环境下的数据共享** 当多个线程需要并发地访问和修改一个...

    java7-8中的 HashMap和ConcurrentHashMap全解析

    在Java编程语言中,`HashMap`和`ConcurrentHashMap`是两种非常重要的数据结构,它们都属于`java.util`包,用于存储键值对。本文将深入解析这两个类在Java 7和8版本中的实现原理、特点以及使用场景。 首先,`HashMap...

    java本地缓存ConcurrentHashMap

    java本地缓存ConcurrentHashMap

    Java并发编程笔记之ConcurrentHashMap原理探究.docx

    在ConcurrentHashMap中,数据定位采用二次哈希策略。第一次哈希决定元素所属的Segment,第二次哈希确定元素在Segment内的位置,通常是链表的头部。这种方式虽然增加了查找元素的时间复杂度,但降低了锁的粒度,使得...

    ConcurrentHashMap源码解析

    Segment继承自ReentrantLock,可以看作是ConcurrentHashMap中的锁。每个Segment守护着一个HashEntry数组,这些数组的长度是固定的。ConcurrentHashMap初始化时,通过initialCapacity、loadFactor和concurrencyLevel...

    ConcurrentHashMap的实现原理

    ConcurrentHashMap 广泛应用于 Java 开发中,例如,在大型的 Web 应用程序中,ConcurrentHashMap 可以用来存储用户的 Session 信息,在分布式系统中,ConcurrentHashMap 可以用来存储分布式锁等。

    Java利用ConcurrentHashMap实现本地缓存demo

    Java利用ConcurrentHashMap实现本地缓存demo; 基本功能有缓存有效期、缓存最大数、缓存存入记录、清理线程、过期算法删除缓存、LRU算法删除、获取缓存值等功能。 复制到本地项目的时候,记得改包路径哦~

    ConcurrentHashmap源码

    源码分析见我博文:http://blog.csdn.net/wabiaozia/article/details/50684556

    java7-8中的 HashMap和ConcurrentHashMap全解析.pdf

    在Java 7和8中,HashMap和ConcurrentHashMap是两种重要的数据结构,分别用于非线程安全和线程安全的键值对存储。本篇文章将深入解析这两种数据结构的内部实现,帮助读者理解它们的工作原理。 HashMap是Java中最常用...

    Java中遍历ConcurrentHashMap的四种方式详解

    Java中遍历ConcurrentHashMap的四种方式详解 Java中遍历ConcurrentHashMap的四种方式详解是Java开发中一个非常重要的知识点。ConcurrentHashMap是Java中一种高效且线程安全的HashMap实现,它提供了高效的读写操作...

    HashTable、ConcurrentHashMap.pdf

    在Java面试中,经常会问到关于数据结构如HashTable和ConcurrentHashMap的细节,以及它们在并发编程中的使用。 最后,文档中出现了诸如“2399”、“1328”、“2645”、“2633”等数字,很可能是引用了一些代码片段或...

    Java中的ConcurrentHashMap:线程安全的哈希表实现与代码示例

    在Java的并发编程中,ConcurrentHashMap 是一个非常重要的组件,它提供了线程安全的HashMap实现。本文将深入探讨 ConcurrentHashMap 的内部实现原理,并通过代码示例展示其使用方法和优势。 通过本文,我们深入探讨...

    ConcurrentHashMap的实现原理(JDK1.7和JDK1.8).pdf

    `ConcurrentHashMap`是Java并发编程中非常重要的一个数据结构,它是线程安全的HashMap实现。在理解`ConcurrentHashMap`的实现原理之前,我们先来看看哈希表的基本概念。 哈希表是一种键值对存储的数据结构,通过键...

Global site tag (gtag.js) - Google Analytics