随机终止的Java多线程线程
在学习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",
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