2011-11-17 154 views
3

我有由多個線程在Java program.This方法訪問的方法相同的方法有:被多個線程訪問

  1. 全局對象變量
  2. 局部變量
  3. 形式參數。

現在這種方法不是同步的,所以當多個線程改變上面三種類型的變量的值時,這些改變反映在其他線程或每個線程將具有這些變量的單獨副本。

+0

查看http://download.oracle.com/javase/tutorial/essential/concurrency/index.html –

回答

2

全局對象:將反映更改

局部變量:不會

形式參數:對象引用都將反映變化和原始類型的參數將不能反映更改。

0

將改變球體對象 局部變量不會 參數可以改變,如果它們是對象,如果它們是原始類型,如整數,他們不會。即使它們是對象,如果每個線程在調用方法之前創建它們,它們都不會改變,並且它們不會被重用。

但這並不是全部,因爲你無法控制執行順序,即使當一個線程正在處理時,它們也會隨機改變,所以如果你有一個全局變量 int myVar = 0;

和方法確實

 

    { // line 10 
     myVar = 1; // line 11 
     myVar += 7; // line 12 
    } // line 13 

沒有出示擔保在所有的變量是1的行12年初,因爲一些其他線程可能已經改變了所花費的時間程序的價值從第11行到第12行。

底線這是一個難題。您需要同步方法或將鎖添加到作爲參數傳遞的全局變量和對象。

2

其他一些答案忘記提及一個非常重要的事實。

更改對象作爲參數和全局變量通過與其他線程共享然而,:

沒有同步你永遠不會知道什麼時候(也許永遠!)這些變化將在其他線程中。除了只允許方法中的一個線程同時阻止100種競爭條件之外,進入和退出同步塊還會觸發所有的高速緩存被清除,並且數據將在線程/內核之間共享。

多線程很難找到正確的,仔細閱讀它。我推薦Goetz的'Java Concurrency in Practice'。