![](/img/trans.png)
[英]confusion over static final method accessed by multiple threads at the same time
[英]Same method accessed by multiple threads
我有一個方法可以被java程序中的多個線程訪問。這個方法有:
現在這個方法不同步,因此當多個線程更改上述三種類型的變量的值時,這些更改將反映在其他線程中,或者每個線程將具有這些變量的單獨副本。
全局對象 :將反映變化
局部變量 :不會
形式參數 :對象引用將反映基元類型的變化和參數不會反映變化。
這里的其他一些答案忘記提到一個非常重要的事實。
作為參數傳遞的對象的更改和全局變量與其他線程共享,但是:
如果沒有同步,您將永遠不知道何時(可能永遠不會!)這些更改將在其他線程中顯示。 除了同時允許方法中的一個線程防止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.