双核/四核 多线程随机数产生相同 本帖最后由 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来产生一个随机数作为种子选一个凑活着用吧。 ITAT复赛试题答案(帮帮忙吧!!! java读取PDF文档/word文档 这一题怎么做? 一个框架程序编译运行正常,为何不显示结果 关于找1的问题 Java 应用程序的语言问题 寻求 Cad 操作帮助 在用RandomAccessFile时写入文本文件(TXT)的数据是乱码(中文)英文是好的 有点难受-----二维数组倒置 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();
}
}