2015-02-08 119 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]變量「值」被多個線程(主線程以及其他線程)使用。因此,用於更改變量狀態的方法需要是線程安全的,以控制最終長度。這裏情況不同。