[英]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設置的值。
線程不會覆蓋彼此的值,因為變量完全在堆棧上。 每個線程都有一個單獨的堆棧。
這不是一個線程安全的方法,但所有自動變量都是自動線程安全的,因為無論何時調用該函數,您都會得到一個新的堆棧幀。 所有本地人在進入該功能時創建,並在退出時銷毀。 如上所述,如果你使用過靜態存儲,那么你會得到意想不到的結果。
不,他們在內存中沒有共享相同的空間。 你的電話,他們會回來,(在你列出的順序): 10
, 20
,和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.