gpt4 book ai didi

java - 可能以线程安全的方式安全地增加 BigInteger,也许使用 AtomicReference,w/o 锁定?

转载 作者:搜寻专家 更新时间:2023-10-30 21:05:22 31 4
gpt4 key购买 nike

我们的很多代码都是遗留的,但我们正在转向“大数据”后端,我正在努力传播更新的 API 调用,鼓励使用最新的 Spring 库等。我们的问题之一是应用层 ID 生成。出于我不明白的原因,更高的权威想要连续的 BigInteger。我本来可以通过重新生成并重新尝试失败的插入来随机生成它们,但我确实被否决了。

撇开提示不谈,我现在需要递增并获得跨线程的 BigInteger,并以安全和高效的方式进行。我以前从未使用过 AtomicReference,但它看起来非常适合此应用程序。现在我们有一个同步代码块,它严重损害了我们的性能。

这是正确的方法吗?语法示例?

我应该提到这个模块的工作方式,它使用存储过程访问数据库以获取要使用的值范围。一次数以万计,所以它可能只在 20 分钟内发生一次。这可以防止各种服务器相互踩踏,但也增加了必须将 BigInteger 设置为任意后续值的麻烦。当然,这也需要是线程安全的。

附言我仍然认为我的随机生成想法比处理所有这些线程的东西要好。 BigInteger 是一个大得离谱的数字,两次生成相同数字的几率必须接近于零。

最佳答案

可以使用 AtomicReference 这是一个快速草稿:

public final class AtomicBigInteger {

private final AtomicReference<BigInteger> valueHolder = new AtomicReference<>();

public AtomicBigInteger(BigInteger bigInteger) {
valueHolder.set(bigInteger);
}

public BigInteger incrementAndGet() {
for (; ; ) {
BigInteger current = valueHolder.get();
BigInteger next = current.add(BigInteger.ONE);
if (valueHolder.compareAndSet(current, next)) {
return next;
}
}
}
}

它基本上是 incrementAndGet() 的 AtomicLong 代码的副本

关于java - 可能以线程安全的方式安全地增加 BigInteger,也许使用 AtomicReference,w/o 锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14006495/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com