所以我目前正在尝试理解并发性。在我的代码中,我创建了一个以“var”为特色的“Summer”类。其方法sumUP将var增加2000000。 我的第二个类是一个Thread,它将Summer作为一个参数并调用它的方法sumUp。 两个对象都被初始化并在我的主线程中启动。
在我理解之后,结果应该是任意的,基本上给出我的随机数。主线程和第二线程创建自己的变量副本并单独更改。
我的代码根本不是线程安全,没有易失性,没有同步,但答案总是4000000。你能解释一下我的错误还是蚀刻修复线程安全对我来说?在此先感谢:)
public class Main {
public static void main(String[]agrs) {
Summer summer = new Summer();
Thread t1 = new Thread(new MyRunnable(summer));
summer.sumUp();
t1.start();
}
}
public class MyRunnable implements Runnable {
private Summer summer;
public MyRunnable(Summer summer) {
this.summer = summer;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " hat gestartet R");
summer.sumUp();
System.out.println("Thread val =" + summer.val);
}
}
public class Summer {
public int val;
public void sumUp() {
for(int i=0; i<2000000; i++) {
increment();
}
System.out.println("MainThread val = " + val);
}
private void increment() {
val++;
}
}
(我知道var应该是私有的,但那样更快:))
答案 0 :(得分:3)
只有在第一次运行sumUp
后才启动线程,将值保留为2000000.您可能会遇到&#34;期望的&#34;首先启动线程的问题。
PS:这与Eclipse无关。
答案 1 :(得分:3)
Thread.start创建“关系前发生”。引用此Question。
当一个语句调用Thread.start()时,每个语句都有一个 发生 - 在与该陈述的关系也有一个 发生在与新执行的每个语句的关系之前 线。导致创建新代码的代码的影响 线程对新线程可见
因此,当线程缓存初始化时,夏天的值已经是2000000。