簡體   English   中英

多個線程訪問的方法相同

[英]Same method accessed by multiple threads

我有一個方法可以被java程序中的多個線程訪問。這個方法有:

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

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

全局對象 :將反映變化

局部變量 :不會

形式參數 :對象引用將反映基元類型的變化和參數不會反映變化。

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

作為參數傳遞的對象的更改和全局變量與其他線程共享,但是:

如果沒有同步,您將永遠不知道何時(可能永遠不會!)這些更改將在其他線程中顯示。 除了同時允許方法中的一個線程防止100種競爭條件之外,進入和退出同步塊還將觸發要清除的所有高速緩存並且在線程/核之間共享數據。

多線程很難做到正確,仔細閱讀。 我推薦Goetz的“Java Concurrency in Practice”。

Golbal對象將被更改,Local vars將不會參數可以更改,如果它們是對象,如果它們是原始類型,如整數,他們將不會。 即使它們是對象,如果每個線程在調用方法之前創建它們並且它們不被重用,它們也可能不會改變。

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

而且方法可以

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

由於某些其他線程可能已經改變了程序從第11行到第12行所花費的時間內的值,因此根本沒有保證變量在第12行的開頭是1。

底線這是一個騙局的秘訣。 您需要同步方法或將鎖定添加到全局變量以及作為參數傳遞的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM