的Java多线程的线程随机
问题描述:
终止在学习Java并发我就遇到了这个行为,我无法解释:的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;
}
}
}
程序为何生成随机字符串?更重要的是为什么输出长度不一?它不应该总是100个字符吗?
输出的例子:
22222222222222222222222222222222222222222222222222
1111111111111111111111111111112121112211221111122222222222222
等。
答
在更新后的问题的主题(为什么输出的长度变化?应该不是总是恰好是100个字符?)
的行为将是不可预测的,因为新的String的重新分配不是原子的。请注意,字符串是不可变的,并且您不断向变量重新赋值。所以发生的是一个线程获取值,另一个线程获取值,一个线程添加一个字符并重新写入,但另一个线程获得旧值。现在,您正在丢失数据,因为其中一个线程的更新丢失了。
在这种情况下,您可以使用线程安全的StringBuffer或添加同步,我相信您会了解到这一点。
答
原因是有两个线程。
- 被追加到相同的字符串值
- ThreadInterferrence线程被再次追加到相同的字符串值主线程。
它是操作系统(OS)谁安排哪个线程运行时,因此你看到随机输出。所以在你的情况下,操作系统安排你的runnable暂时运行打印1,然后尝试运行主线程,然后打印2.
答
[问题]更重要的是为什么输出长度会有所不同?
[Answer]变量“值”被多个线程(主线程以及其他线程)使用。因此,用于更改变量状态的方法需要是线程安全的,以控制最终长度。这里情况不同。
好吧,我跟着你到目前为止。但是为什么输出字符串的长度会变化?无论顺序如何,它不应该总是100个字符吗? – 2015-02-08 14:51:33