java是否有可能以线程安全的方式安全地递增BigInteger,可能是使用AtomicReference,不带锁?
我们的很多代码都是遗留的,但我们正在转向“大数据”后端,我正在努力宣传新的API调用,鼓励使用最新的Spring库等。我们的问题之一是应用层ID生成。出于我不明白的原因,一个更高的权威想要序列的BigInteger。我本可以通过重新生成并重新尝试失败的插入来随机设置它们,但我确实被否决了
撇开牢骚不谈,我现在的处境是,我需要在线程之间递增并获得一个大整数,并以安全且高效的方式执行它。我以前从未使用过AtomicReference,但它看起来非常适合这个应用程序。现在我们有一个同步的代码块,这严重影响了我们的性能
走这条路对吗?语法示例
我应该提到的是,这个模块的工作方式是,它使用存储过程访问数据库,以获取一系列要使用的值。一次数万次,所以可能每20分钟只发生一次。这可以防止不同的服务器相互攻击,但也增加了必须将BigInteger设置为任意后续值的麻烦。当然,这也需要线程安全
另外,我仍然认为我的随机生成想法比处理所有这些线程的东西要好。BigInteger是一个非常大的数字,两次生成同一个数字的几率必须接近零
# 1 楼答案
使用Java8中引入的^{} 或^{} ,这将变得更易于管理和理解。通过提供一个累加器函数,可以将值设置为函数的结果,并根据需要返回之前的结果或计算结果,从而自动更新值。下面是一个关于该类的示例,接下来是我编写的一个使用该类的简单示例:
使用它的一个例子:
以及在我的机器上运行示例的输出:
# 2 楼答案
使用原子参考是可能的,这里有一个快速草案:
它基本上是
incrementAndGet()
的原子长代码的副本