ConcurrentHashMap 中 String intern 方法的去重

Deduplication for String intern method in ConcurrentHashMap

我看了Java天的一个代码,作者说这种有概率的方法对于存储字符串非常有效,类似于String intern方法

 public class CHMDeduplicator<T> {
    private final int prob;
    private final Map<T, T> map;

    public CHMDeduplicator(double prob) {
        this.prob = (int) (Integer.MIN_VALUE + prob * (1L << 32));
        this.map = new ConcurrentHashMap<>();
    }

    public T dedup(T t) {
        if (ThreadLocalRandom.current().nextInt() > prob) {
            return t;
        }
        T exist = map.putIfAbsent(t, t);
        return (exist == null) ? t : exist;
    }
}

请解释一下,概率在这一行中的作用是什么:

if (ThreadLocalRandom.current().nextInt() > prob) return t;

这是 Java 天 https://shipilev.net/talks/jpoint-April2015-string-catechism.pdf 的原始演示文稿 (第 56 张幻灯片)

传递给构造函数的双精度值旨在成为 0.0 到 1.0 范围内的概率值。它被转换为一个整数,使得它下面的整数值的比例等于双精度值。

整个表达式的计算结果为 true 的概率等于构造函数参数的概率。通过使用整数数学,它会比使用原始双精度值稍微快一些。

实现的目的是有时候不缓存String,直接返回。这样做的原因是 CPU 与内存性能的权衡:如果内存节省缓存过程导致 CPU 瓶颈,您可以调高 "do nothing" 概率,直到找到平衡点.

如果您查看 下一张 幻灯片,其中 table 的数据具有不同的概率,或者 talk,您将 see/hear 基本原理:概率重复数据删除程序平衡了对字符串进行重复数据删除所花费的时间,以及重复数据删除所节省的内存。这允许微调处理字符串所花费的时间,甚至可以在代码周围散布低概率重复数据删除器,从而分摊重复数据删除成本。

(来源:这些是我的幻灯片)