2015-02-08 96 views
1

终止在学习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 

等。

回答

3

在更新后的问题的主题(为什么输出的长度变化?应该不是总是恰好是100个字符?)

的行为将是不可预测的,因为新的String的重新分配不是原子的。请注意,字符串是不可变的,并且您不断向变量重新赋值。所以发生的是一个线程获取值,另一个线程获取值,一个线程添加一个字符并重新写入,但另一个线程获得旧值。现在,您正在丢失数据,因为其中一个线程的更新丢失了。

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

4

原因是有两个线程。

  • 被追加到相同的字符串值
  • ThreadInterferrence线程被再次追加到相同的字符串值主线程。

它是操作系统(OS)谁安排哪个线程运行时,因此你看到随机输出。所以在你的情况下,操作系统安排你的runnable暂时运行打印1,然后尝试运行主线程,然后打印2.

+0

好吧,我跟着你到目前为止。但是为什么输出字符串的长度会变化?无论顺序如何,它不应该总是100个字符吗? – 2015-02-08 14:51:33

1

[问题]更重要的是为什么输出长度会有所不同?

[Answer]变量“值”被多个线程(主线程以及其他线程)使用。因此,用于更改变量状态的方法需要是线程安全的,以控制最终长度。这里情况不同。