双核/四核 多线程随机数产生相同 本帖最后由 ctl71801 于 2013-09-25 10:23:43 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你去看看Random()的构造函数源代码就立马知道为啥了。所以new Random(seed) 时要给构造函数传递一个不重复的数作为随机种子,这个就发挥你聪明才智了。 data是全局变量,你觉得data线程安全吗?Thread-1data :97343320Thread-4data :97343320随机数相同完全是由于data全局变量线程不安全引起的。你把data换成局部变量试试。。 private static int data = 0; private static int count = 0; public static void main(String[] args) { for (int i = 0; i < 2; i++) { new Thread(new Runnable() { @Override public void run() { synchronized (ThreadRandom.class) { data = new Random(System.currentTimeMillis() + count) .nextInt(); System.out.println(Thread.currentThread().getName() + "data :" + data); count ++; } } }).start(); } } 1、用:System.nanoTime() 再加 线程名字的hash值 2、先准备一个Random seed = Random(),然后创建线程时,都依次先用这个seed来产生一个随机数作为种子选一个凑活着用吧。 大家讨论一下ThreadLocal 父类实现了java.io.Serializable,子类还需要再申明implements java.io.Serializable吗 用uml的用例图可不可以做详细设计 学习JAVA,要有什么样的基础呀?? 如何控制使用Runtime.exec调用的外部可执行程序,请帮忙,高分相赠 ServerSocket 和 Socket 相互发信息的问题 请问哪个版人气最旺,我想问一个关于VSS的问题。 线程休眠 内部类问题?????? java如何结束一个过程函数呢????? 求教:正则表达式如何匹配法文字母 java对音频文件检查是否有声音
Thread-4data :97343320随机数相同完全是由于data全局变量线程不安全引起的。你把data换成局部变量试试。。
private static int count = 0; public static void main(String[] args) { for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (ThreadRandom.class) {
data = new Random(System.currentTimeMillis() + count)
.nextInt();
System.out.println(Thread.currentThread().getName()
+ "data :" + data);
count ++;
}
}
}).start();
}
}