Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ThreadLocalRandom或AtomicInteger_Java_Random - Fatal编程技术网

Java ThreadLocalRandom或AtomicInteger

Java ThreadLocalRandom或AtomicInteger,java,random,Java,Random,我需要在多个线程中生成非重叠的数字(随机或增量并不重要,因为每个生成的数字都是唯一的)。我想我有两个选择 使用AtomicInteger并跨所有线程共享它 为每个线程使用具有不同开始和结束范围的ThreadLocalRandom 我需要这是非常快的,而且数字应该是唯一的所有线程。哪一个更好?选项1会更慢,因为AtomicInteger通过使用volatile int提供线程安全性,这意味着修改或读取必须始终从RAM获取/写入RAM,这将始终比在处理器缓存中读取/写入慢 选项2可能会更快(取决于计

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

  • 使用AtomicInteger并跨所有线程共享它
  • 为每个线程使用具有不同开始和结束范围的ThreadLocalRandom

  • 我需要这是非常快的,而且数字应该是唯一的所有线程。哪一个更好?

    选项1会更慢,因为
    AtomicInteger
    通过使用
    volatile int
    提供线程安全性,这意味着修改或读取必须始终从RAM获取/写入RAM,这将始终比在处理器缓存中读取/写入慢

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


    我可以建议第三种选择吗?使用具有预定义范围的本地线程
    int
    long
    。您不必担心缓存的一致性,因为只有一个线程可以访问存储的每个基本计数器。你仍然有被包围的风险,但你会确切地知道它何时发生,与在随机数序列上遇到重复项的风险不同。

    UUID是否对you@WandMaker不,它必须是numericsThreadLocalRandom,就像官方java文档中指出的那样,我不确定怎么会有重复的。看看这个:@Pangea和任何RNG一样,你都有机会运行重复的数据。@Pangea你可以很容易地得到重复的数据-我们处理的是多个随机数生成器,因此,无论数字是如何随机生成的,你都可能在不同的序列中得到重复的数据。有了计数器,你至少可以保证在得到一个副本之前通过整个数字行。@JohnVint这是理论上的限制还是实际的限制?@codebind我为每个不会重叠的线程提供上限和下限。