4 回答

TA貢獻1799條經(jīng)驗 獲得超9個贊
這個應(yīng)該與指令重排序沒有關(guān)系。編譯器在某些情況下會對指令的順序進行重排,但是肯定是基于一定的理由。這段代碼我看不出來為什么要重排指令順序。
我認為原因很可能出在可見性上。兩個變量都不是volatile的,因此無法保證在一個線程中賦值后在另一個線程中一定可見??梢試L試加上volatile,然后看看還會不會出現(xiàn)這種情況。如果不會出現(xiàn),那么就與指令重排無關(guān)

TA貢獻1876條經(jīng)驗 獲得超5個贊
java多線程調(diào)度方式默認是搶占式。線程t1執(zhí)行到一半(給age賦完值),這時候t2搶到了執(zhí)行權(quán),打印出來就只有age,name為String類型的默認值。

TA貢獻1797條經(jīng)驗 獲得超6個贊
問題出在這里
t2.start();
t1.start();
線程先執(zhí)行g(shù)et方法,set方法你還沒設(shè)值,所以默認是null和0,為什么有時候有值呢,由于線程隨機性,有時候t1先執(zhí)行,t2后執(zhí)行,就得到27,zjan
先這樣改
t1.start();
t2.start();
如果要保證得到的都是27,zjan還要保證線程同步性,上面說的加關(guān)鍵字volatie以及synchronize都能解決
手機碼字,見諒
添加回答
舉報