Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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_String_Multithreading_Concurrency_Terminate - Fatal编程技术网

随机终止的Java多线程线程

随机终止的Java多线程线程,java,string,multithreading,concurrency,terminate,Java,String,Multithreading,Concurrency,Terminate,在学习Java并发时,我遇到了无法解释的行为: public class ThreadInterferrence implements Runnable { public static void main(String[] args) throws InterruptedException { Thread t = new Thread(new ThreadInterferrence()); t.start(); append("1",

在学习Java并发时,我遇到了无法解释的行为:

public class ThreadInterferrence implements Runnable {

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(new ThreadInterferrence());
        t.start();
        append("1", 50);
        t.join();
        System.out.println(value);
    }

    private static String value = "";

    public void run() {
        append("2", 50);
    }

    private static void append(String what, int times) {
        for (int i = 0; i < times; ++i) {
            value = value + what;
        }
    }
}

等等,原因是你有两个线程

附加到相同值字符串的主线程 ThreadInterference线程,该线程将再次追加到相同的值字符串。
是操作系统操作系统在安排何时运行哪个线程,因此您可以看到随机输出。因此,在您的情况下,操作系统会安排您的runnable运行一段时间,先打印1,然后尝试运行主线程,然后再打印2。

原因是您有两个线程

附加到相同值字符串的主线程 ThreadInterference线程,该线程将再次追加到相同的值字符串。
是操作系统操作系统在安排何时运行哪个线程,因此您可以看到随机输出。因此,在您的情况下,操作系统会安排runnable运行一段时间,先打印1,然后尝试运行主线程,然后再打印2。更重要的是,为什么输出的长度会有所不同


[答:]多线程主线程和其他线程正在使用该变量值。因此,用于更改变量状态的方法需要是线程安全的,以控制最终长度。这里的情况并非如此

[问题]更重要的是,为什么输出的长度不同


[答:]多线程主线程和其他线程正在使用该变量值。因此,用于更改变量状态的方法需要是线程安全的,以控制最终长度。这里的情况并非如此

关于您更新的问题,为什么输出长度不同?它不应该一直精确到100个字符吗

由于新字符串的重新分配不是原子的,因此该行为将是不可预测的。请注意,字符串是不可变的,您会不断地将值重新赋值给变量。所以发生的事情是一个线程获取值,另一个线程也获取值,一个线程添加一个字符并再次写入,但另一个线程也使用旧值。现在您正在丢失数据,因为其中一个线程的更新已丢失


在这种情况下,您可以使用线程安全的StringBuffer,或者添加同步,我相信您会了解到这一点。

关于您更新的问题,为什么输出长度会变化?它不应该一直精确到100个字符吗

由于新字符串的重新分配不是原子的,因此该行为将是不可预测的。请注意,字符串是不可变的,您会不断地将值重新赋值给变量。所以发生的事情是一个线程获取值,另一个线程也获取值,一个线程添加一个字符并再次写入,但另一个线程也使用旧值。现在您正在丢失数据,因为其中一个线程的更新已丢失


在这种情况下,您可以使用线程安全的StringBuffer,或者添加同步,我相信您会了解到这一点。

好的,到目前为止,我一直在关注您。但是为什么输出字符串的长度不同呢?不应该总是100个字符,不管顺序如何吗?好的,到目前为止我一直在关注你。但是为什么输出字符串的长度不同呢?不管顺序如何,它不应该总是正好100个字符吗?
22222222222222222222222222222222222222222222222222
1111111111111111111111111111112121112211221111122222222222222