Javaのjava.util.Collections
にはshuffle
という便利なメソッドがありますが、shuffle(List<?> list)
はマルチスレッドで遅くなります。JDK8u121の実装では次のようになっています。
public static void shuffle(List<?> list) { |
java.util.Random
を共有して処理する事になるので、複数のスレッドでCollections.shuffle
を呼び出すと処理が詰まるわけです。Collectionsにはshuffle(List<?> list, Random rnd)
というメソッドがあるので、次のように使うのが良いと思います。
Collections.shuffle(list, ThreadLocalRandom.current()) |
別件ですが、複数のスレッドで同じListに対してCollections.shuffle
を呼び出すと壊れます。(そんな事をする人は少ないと思いますが)
どれくらい遅いのか?
JMHで簡単に計ってみました。
Benchmark Mode Cnt Score Error Units |
|