我的代码不是线程安全的,为什么我的线程同步?

时间:2018-01-29 15:51:27

标签: java multithreading concurrency

所以我目前正在尝试理解并发性。在我的代码中,我创建了一个以“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应该是私有的,但那样更快:))

2 个答案:

答案 0 :(得分:3)

只有在第一次运行sumUp后才启动线程,将值保留为2000000.您可能会遇到&#34;期望的&#34;首先启动线程的问题。

PS:这与Eclipse无关。

答案 1 :(得分:3)

Thread.start创建“关系前发生”。引用此Question

  

当一个语句调用Thread.start()时,每个语句都有一个   发生 - 在与该陈述的关系也有一个   发生在与新执行的每个语句的关系之前   线。导致创建新代码的代码的影响   线程对新线程可见

因此,当线程缓存初始化时,夏天的值已经是2000000。