public?class?test1?{
????private?int?a=1,?b=2;
????public?void?foo(){?
????????a=3;
????????b=4;
????}
????public?int?getA(){?
????????return?a;
????}????
????public?int?getB(){
????????return?b;
????}
}
當線程1執行foo方法的時候,線程2訪問getA和getB會得到什么樣的結果?A: a=1, b=2????//都未改變B: a=3,b=4????//都改變了C: a=3,b=2????//a改變了,b未改變D: a=1,b=4????//b改變了,a未改變
13 回答
已采納
白綠色
TA貢獻3條經驗 獲得超11個贊
其實答案是不定的,看哪個線程先搶到cpu時間。不能用代碼的先后順序決定線程的執行順序。而且線程有沒有加鎖等等都會影響。
//?就這個例子來說大多數情況都變。
public?static?void?main(String[]?args)?{
????final?test1?t?=?new?test1();
new?Thread()?{
public?void?run()?{
t.foo();
}
}.start();
new?Thread()?{
public?void?run()?{
System.out.println(t.getA()?+?"--"?+?t.getB());
}
}.start();
}
//?但是實際項目中如果foo()執行的時間長,可能foo還沒執行完,cpu就會把時間片切換到第二個線程執行。
//?所以每次的結果可能都不一樣。
//?例如把foo()改成這樣,讓它的執行時間變長,可能就都不變。把循環次數改小,執行時間變短,可能都變
public?void?foo(){
????long?i?=?0;
????while(i<1000000000)?{
int?c?=?a?+?b;
i++;
????}
????a=3;
????b=4;
}
綠洲仙人球
TA貢獻39條經驗 獲得超47個贊
建議提問者把輸出調用方法的代碼也貼出來,我通過new test1 的方法創建一個實例,然后調用方法,輸出的答案是B
Java中沒有全局變量的概念,需要分清是對變量的引用改值還是對變量本身改值
和木雪3217235
TA貢獻13條經驗 獲得超4個贊
選A吧。不過不知道你的截圖是不是整個題目的。雖然你定義了foo函數。在里面重新定義了A,B的值。但是你并沒有對foo這個函數有過操作。所以,a、b的值都是原來初始化的時候的值、
添加回答
舉報
0/150
提交
取消
