ThreadLocalRandom或AtomicInteger

时间:2015-07-14 17:39:35

标签: java random

我需要在多个线程中生成非重叠数字(随机或增量无关紧要,因为每个生成的数字都是唯一的)。我想我有两个选择

  1. 使用AtomicInteger并在所有线程中共享
  2. 对每个线程使用具有不同开始和结束范围的ThreadLocalRandom
  3. 我需要非常快,而且所有线程中的数字都应该是唯一的。哪一个更好?

1 个答案:

答案 0 :(得分:3)

选项1将会变慢,因为AtomicInteger通过使用volatile int提供线程安全 - 意味着修改或读取必须始终从RAM中读取/写入,这将总是比在处理器的高速缓冲存储器中读/写慢。

选项2可能更快(取决于计算序列中下一个数字与内存提取所花费的时间),但您冒着随机生成重复数字的风险(尽管很小)。

我可以建议第三种选择吗?使用具有预定义范围的本地intlong线程。您不必担心缓存一致性,因为只有一个线程可以访问您存储的每个原始计数器。你仍然存在环绕的风险,但你会确切地知道它何时发生,而不像在随机数字序列上运行重复的风险。