Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的代码不是线程安全的,为什么我的线程是同步的?_Java_Multithreading_Concurrency - Fatal编程技术网

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

Java 我的代码不是线程安全的,为什么我的线程是同步的?,java,multithreading,concurrency,Java,Multithreading,Concurrency,因此,我目前正在尝试理解并发性。在我的代码中,我创建了一个具有int变量的类“Summer”。它的methode summap将var增加2000000。 我的第二个类是一个线程,它将Summer作为参数并调用其方法summap。 这两个对象都在我的主线程中初始化和启动 在我理解后,结果应该是任意的,基本上是随机数。主线程和第二线程创建自己的变量副本,并独立更改它 我的代码根本不是线程安全的,没有易失性,没有同步,答案总是4000000。您能解释一下我的错误吗?或者eclipse是否为我修复了线

因此,我目前正在尝试理解并发性。在我的代码中,我创建了一个具有int变量的类“Summer”。它的methode summap将var增加2000000。 我的第二个类是一个线程,它将Summer作为参数并调用其方法summap。 这两个对象都在我的主线程中初始化和启动

在我理解后,结果应该是任意的,基本上是随机数。主线程和第二线程创建自己的变量副本,并独立更改它

我的代码根本不是线程安全的,没有易失性,没有同步,答案总是4000000。您能解释一下我的错误吗?或者eclipse是否为我修复了线程安全性?提前感谢:)

公共类主{
公共静态void main(字符串[]agrs){
夏天=新的夏天();
线程t1=新线程(新MyRunnable(summer));
summer.summup();
t1.start();
}
}
公共类MyRunnable实现Runnable{
私人夏日;
公共MyRunnable(夏季){
这个夏天=夏天;
}
@凌驾
公开募捐{
System.out.println(Thread.currentThread().getName()+“hat-gestarter R”);
summer.summup();
System.out.println(“Thread val=“+summer.val”);
}
}
公营暑期班{
公共国际价值;
公共空间总结(){

对于(int i=0;i仅在第一次运行
summap
完成后启动线程,将值保留为2000000。首先启动线程可能会遇到“所需”问题

注:这与Eclipse无关。

Thread.start创建了一个“发生在关系之前”的语句

当语句调用Thread.start()时,每个具有 与该语句的关系之前发生的事件也具有 在与新语句执行的每个语句的关系之前发生 导致创建新线程的代码的效果 线程对新线程可见


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

这与Eclipse无关,Eclipse只是您的开发环境。这个问题是关于Java如何工作的。最好的答案是,它实际上解释了同步的位置。请注意,这是一个API功能,实际上不是语言的一部分。
 java.util.concurrency
还有许多类指定了一个before关系。
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++;
}

}