我正在使用一个调用新Random()。nextLong()生成nonces的OAuth库,但它在异步调用上会生成相同的nonce。我已经缩小到线程Random.nextLong()每隔一段时间返回相同的确切数字。Java线程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();
}
}
}
你可以发布您的代码 – 2011-01-25 19:25:04
见的SecureRandom - http://download.oracle.com/javase/7/docs/api/java/security/SecureRandom.html – jjnguy 2011-01-25 19:26:29
这实在不应该发生,尤其不应该因为它使用System.nanoTime和一个易变的seedUniquifier。 – maaartinus 2011-01-25 19:31:18