ConcurrentHashMap之spread方法

spread方法是ConcurrentHashMap中的一个辅助方法,它用于在哈希表扩容时分散元素。在Java中,ConcurrentHashMap使用了一种名为“扩容重分配”(resizing/rehashing)的机制来处理动态大小调整的需求。spread方法就是用来在这个过程中计算新的哈希表索引位置的。

这个方法接收一个整数hash作为输入,并返回一个新的哈希值。它通过按位异或(^)和无符号右移(>>>)操作来混淆原始哈希值的高低位,进一步分散哈希值的分布。

这个方法不是公开API的一部分,因此不推荐在应用程序代码中直接使用。如果你需要一个类似的哈希分散功能,你应该考虑自行实现或者使用其他的哈希分散函数。

	 /**
     * Spreads (XORs) higher bits of hash to lower and also forces top
     * bit to 0. Because the table uses power-of-two masking, sets of
     * hashes that vary only in bits above the current mask will
     * always collide. (Among known examples are sets of Float keys
     * holding consecutive whole numbers in small tables.)  So we
     * apply a transform that spreads the impact of higher bits
     * downward. There is a tradeoff between speed, utility, and
     * quality of bit-spreading. Because many common sets of hashes
     * are already reasonably distributed (so don't benefit from
     * spreading), and because we use trees to handle large sets of
     * collisions in bins, we just XOR some shifted bits in the
     * cheapest possible way to reduce systematic lossage, as well as
     * to incorporate impact of the highest bits that would otherwise
     * never be used in index calculations because of table bounds.
     */
	static final int spread(int h) {
        return (h ^ (h >>> 16)) & HASH_BITS;
    }

Spreads (XORs) higher bits of hash to lower and also forces top bit to 0.

将哈希值的高位扩展(异或)到低位,并强制将高位 置为0.

Because the table uses power-of-two masking, sets of hashes that vary only in bits above the current mask will always collide.

因为列表使用的是掩码的二次幂,仅在二进制位上变化的哈希值集合将始终发生冲突。

(Among known examples are sets of Float keys holding consecutive whole numbers in small tables.)

在已知的例子中,有一组在小表中保存连续整数的浮点键。

So we apply a transform that spreads the impact of higher bits downward.

所以我们应用一个转换,用于把高位的影响扩张到低位

There is a tradeoff between speed, utility, and quality of bit-spreading.

在位扩张上有一个位于速度、实用和质量的平衡

Because many common sets of hashes are already reasonably distributed (so don’t benefit from spreading), and because we use trees to handle large sets of collisions in bins,

因为许多普通hash集合已经合理的分布(所以未从扩张中获益),而且我们使用 红黑树 去处理位于同一个桶中的hash

we just XOR some shifted bits in the cheapest possible way to reduce systematic lossage,

我们使用可能是最廉价的异或操作位数来减少系统性能损耗

as well as to incorporate impact of the highest bits that would otherwise never be used in index calculations because of table bounds.

以及合并高位的影响,否则可能会出现因为表边界导致计算出来的下标永远不会用到。

copy by https://www.cnblogs.com/brave-rocker/p/13338062.html

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ConcurrentHashMap的size方法返回当前映射中键值对的数量。由于ConcurrentHashMap是线程安全的,因此在多个线程同时访问时,size方法可能会返回一个近似值,而不是精确的值。这是因为在多个线程同时进行插入、删除等操作时,size方法需要遍历整个映射,而这个过程中可能会有其他线程同时进行修改操作,导致size方法返回的值不是最新的。因此,ConcurrentHashMap的size方法适用于需要一个近似值的场景,如果需要精确的值,可以使用其他方法,如遍历整个映射并计数。 ### 回答2: ConcurrentHashMap的size方法是用来获取当前ConcurrentHashMap中键值对的数量的。ConcurrentHashMapJava中的一个线程安全的哈希表,它通过细粒度的锁机制来实现多线程并发访问的效率。 在ConcurrentHashMap中,不同的线程可以同时进行读取操作,而且读取操作不需要加锁,这大大提高了读取操作的效率。但是如果有多个线程同时进行写入操作,那么这些写入操作就需要加锁来保证线程安全。 在ConcurrentHashMap的实现中,为了同时满足读取的高效率和写入的线程安全,ConcurrentHashMap使用了分段锁机制。它将整个哈希表分成了多个段(Segment),每个段都有自己的锁。这样不同的线程在写入操作时,只需要获取对应段的锁,而不会影响其他段的读取操作。这就保证了ConcurrentHashMap在并发场景下的高性能。 ConcurrentHashMap的size方法的原理是遍历整个哈希表,统计各个段中的键值对数量,并将其累加得到最终的结果。由于ConcurrentHashMap的读取操作不需要加锁,所以在统计的过程中,其他线程可以进行并发的读取操作。 需要注意的是,由于ConcurrentHashMap的size方法是通过遍历整个哈希表来统计数量的,所以在极端的高并发场景下,size方法的返回结果可能不是完全准确的。不过在大多数情况下,ConcurrentHashMap的size方法还是可以提供一个相对准确的结果的。 ### 回答3: ConcurrentHashMapJava中的一个线程安全的哈希表实现,它继承自HashMap并通过使用锁分段技术来实现高并发性能。 ConcurrentHashMap的size()方法用于获取当前哈希表中键值对的数量。该方法通过遍历哈希表的所有段(每个段都是一个小的哈希表),获取每个段中的键值对数量,并将这些数量累加得到最终的结果。由于ConcurrentHashMap的并发性能较高,所以在计算size()的过程中,其他线程可以继续执行其他操作,不会被阻塞。 在计算size()的过程中,如果有其他线程对哈希表进行插入、删除或更新操作,那么在计算结果时可能会发生一些变化。为了保证计算结果的准确性,ConcurrentHashMap使用了一些特殊的技术来解决并发冲突,如使用volatile修饰符保证可见性、使用CAS(Compare and Swap)操作来保证原子性等。 需要注意的是,由于ConcurrentHashMap的size()方法是基于估计值计算得到的,所以在某些情况下,它可能无法返回准确的结果。比如,在计算size()的同时,有其他线程不断地进行插入或删除操作,那么返回的结果可能比实际的键值对数量要大或小一些。如果对结果的准确性有较高的要求,可以考虑使用其他方式来获取准确的数量,例如迭代哈希表并计算实际存在的键值对数量。 总之,ConcurrentHashMap的size()方法是用于获取线程安全哈希表中键值对数量的方法,它通过分段的方式来保证高并发性能,并通过一些特殊的技术来解决并发冲突。但是需要注意的是,由于size()方法是基于估计值计算得到的,所以结果可能不是完全准确的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值