The ThreadLocalRandom class in JDK 7, allows you to generate random numbers from multiple threads. It is more efficient than using shared Random
objects and will result in better performance as there is less overhead and contention.
In addition, this class also provides "bounded" generation methods.
For example, the statement below generates a random number between 1 (inclusive) and 100 (exclusive).
int random = ThreadLocalRandom.current().nextInt(1,100);
Wait, there's a BUG!
While trying out this class, I noticed that the SAME random numbers were being produced across all my threads. I then discovered this bug which reported the same issue I was having. It appears that the seed is never initialised so the same random numbers are produced every time. I wouldn't recommend using this class until the bug is fixed. The following code illustrates the issue:
//3 threads
for(int i = 0; i < 3; i++) {
final Thread thread = new Thread() {
@Override
public void run() {
System.out.print(Thread.currentThread().getName() + ":");
//each thread prints 3 random numbers
for(int j = 0; j < 3; j++) {
final int random = ThreadLocalRandom.current().nextInt(1, 50);
System.out.print(random + ",");
}
System.out.println();
}
};
thread.start();
thread.join();
}
prints:
Thread-0:1,5,24,
Thread-1:1,5,24,
Thread-2:1,5,24,
The bug had been fixed in new jsr166y
ReplyDelete