Aar*_*Guo 5 java multithreading
public class ThinkThreadLocal {
public static int data;
public static void main(String[] args) {
for(int i = 0; i < 2; i++) {
new Thread(new Runnable(){
@Override
public void run() {
data = new Random().nextInt();
System.out.println(Thread.currentThread().getName() + " gene data:" + data);
}
}).start();
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么它打印相同的值?
Thread-0 gene data:-751128970
Thread-1 gene data:-751128970
Run Code Online (Sandbox Code Playgroud)
类Random是一个伪随机数生成器。它从一些种子值开始。如果没有显式指定种子,它将使用当前时间作为种子。
如果您非常快速地创建两个- 编辑:K Erlandsson 是对的;这不是真的……Random对象,它们将使用相同的种子值创建,并且它们将生成相同的随机数序列。
不要Random每次想要生成随机数时都创建一个新对象。
只有一个静态变量data,您在两个线程中都使用它。它们都将写入和读取同一个变量。
更好的版本:
public static void main(String[] args) {
for(int i = 0; i < 2; i++) {
new Thread(new Runnable(){
private final Random random = new Random();
@Override
public void run() {
int data = random.nextInt();
System.out.println(Thread.currentThread().getName() + " gene data:" + data);
}
}).start();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
635 次 |
| 最近记录: |