Java ThreadLocalRandom或AtomicInteger
我需要在多个线程中生成非重叠的数字(随机或增量并不重要,因为每个生成的数字都是唯一的)。我想我有两个选择Java ThreadLocalRandom或AtomicInteger,java,random,Java,Random,我需要在多个线程中生成非重叠的数字(随机或增量并不重要,因为每个生成的数字都是唯一的)。我想我有两个选择 使用AtomicInteger并跨所有线程共享它 为每个线程使用具有不同开始和结束范围的ThreadLocalRandom 我需要这是非常快的,而且数字应该是唯一的所有线程。哪一个更好?选项1会更慢,因为AtomicInteger通过使用volatile int提供线程安全性,这意味着修改或读取必须始终从RAM获取/写入RAM,这将始终比在处理器缓存中读取/写入慢 选项2可能会更快(取决于计
我需要这是非常快的,而且数字应该是唯一的所有线程。哪一个更好?选项1会更慢,因为
AtomicInteger
通过使用volatile int
提供线程安全性,这意味着修改或读取必须始终从RAM获取/写入RAM,这将始终比在处理器缓存中读取/写入慢
选项2可能会更快(取决于计算序列中的下一个数字与内存提取所需的时间),但您会面临随机生成重复数字的风险(尽管风险很小)
我可以建议第三种选择吗?使用具有预定义范围的本地线程
int
或long
。您不必担心缓存的一致性,因为只有一个线程可以访问存储的每个基本计数器。你仍然有被包围的风险,但你会确切地知道它何时发生,与在随机数序列上遇到重复项的风险不同。UUID是否对you@WandMaker不,它必须是numericsThreadLocalRandom,就像官方java文档中指出的那样,我不确定怎么会有重复的。看看这个:@Pangea和任何RNG一样,你都有机会运行重复的数据。@Pangea你可以很容易地得到重复的数据-我们处理的是多个随机数生成器,因此,无论数字是如何随机生成的,你都可能在不同的序列中得到重复的数据。有了计数器,你至少可以保证在得到一个副本之前通过整个数字行。@JohnVint这是理论上的限制还是实际的限制?@codebind我为每个不会重叠的线程提供上限和下限。