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
提交
取消