簡體   English   中英

靜態方法內的變量共享

[英]Variable sharing inside static method

我對靜態方法中的變量有疑問。 靜態方法中的變量是共享相同的內存位置還是它們具有單獨的內存?

這是一個例子。

public class XYZ
{
    Public Static int A(int value)
    {
      int b = value;
      return b;
    }
}

如果3個不同的用戶調用執行方法A.

XYZ.A(10);
XYZ.A(20);
XYZ.A(30);

同時。 每次通話的回報值是多少?

XYZ.A(10)=?
XYZ.A(20)=?
XYZ.A(30)=?

它們仍然是局部變量 - 它們不在線程之間共享。 他們在靜態方法中的事實沒有區別。

如果您使用靜態變量作為中間變量,那是不安全的:

public class XYZ
{
    // Don't do this! Horribly unsafe!
    private static int b;
    public static int A(int value)
    {
        b = value;
        return b;
    }
}

這里,所有的線程都會真正使用相同的b變量,所以如果你同時從多個線程調用該方法,線程X可以寫入b ,然后是線程Y,這樣線程X最終返回線程Y設置的值。

線程不會覆蓋彼此的值,因為變量完全在堆棧上。 每個線程都有一個單獨的堆棧。

這不是一個線程安全的方法,但所有自動變量都是自動線程安全的,因為無論何時調用該函數,您都會得到一個新的堆棧幀。 所有本地人在進入該功能時創建,並在退出時銷毀。 如上所述,如果你使用過靜態存儲,那么你會得到意想不到的結果。

不,他們在內存中沒有共享相同的空間。 你的電話,他們會回來,(在你列出的順序): 1020 ,和30

老實說,使用你的代碼在任何情況下都是如此(因為你只是分配一個值,而不是用它做任何事情)但考慮:

Class XYZ
{
   public static int A (int value)
   {
      b += value;  \\Won't compile: b not initialized
      return b;
   }
}

要么

Class XYZ
{
   public static int A (int value)
   {
      int b = 0;  \\Initialized 'b' for each call
      b += value;  
      return b;
   }
}

由於靜態方法無法訪問實例變量(至少,沒有對實例的引用),因此無法在每次調用代碼時重新初始化靜態方法中的變量一次。 要允許靜態方法更改變量,您需要傳入兩個值來相互操作。

暫無
暫無

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

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