我正在使用调用 new Random().nextLong() 来生成随机数的 OAuth 库,但是它在异步调用时生成相同的随机数。我已将其缩小到线程化 Random.nextLong() 以经常返回相同的确切数字。
有谁知道这是否是 Java 的已知限制?如果是这样,有人知道线程安全操作吗?
编辑:我正在使用 Java 1.6
编辑:这是我制作的一个小程序,用于测试我的大型应用程序中发生的情况。我跑了好几次,比它应该跑的更频繁,当时间相同时,它会产生相同的随机数。请原谅我的快速编程。
public class ThreadedRandom {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new ThreadedRandom().run();
}
private RandomNumberGenerator _generator;
public ThreadedRandom()
{
_generator = new RandomNumberGenerator();
}
public void run()
{
Runnable r = new Runnable() {
@Override public void run() {
System.out.println(System.currentTimeMillis()+"\t"+_generator.gen());
}
};
Thread t1, t2;
t1 = new Thread(r);
t2 = new Thread(r);
t1.start();
t2.start();
}
private class RandomNumberGenerator {
Random random;
public RandomNumberGenerator()
{
random = new Random();
}
public Long gen() {
return new Random().nextLong();
}
}
最佳答案
您可能不想每次都创建一个新的 Random 实例。而是拥有一个全局性的。
关于Java 线程 Random.nextLong() 返回相同的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4797849/