在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Java  HTML/ 使用java多線(xiàn)程時(shí)得到不可思議的結(jié)果,想了好長(zhǎng)時(shí)間都模擬不出是怎樣得到的?

使用java多線(xiàn)程時(shí)得到不可思議的結(jié)果,想了好長(zhǎng)時(shí)間都模擬不出是怎樣得到的?

1、想了解不同類(lèi)型線(xiàn)程之間的關(guān)系(此程序沒(méi)考慮線(xiàn)程安全問(wèn)題),想模擬電腦是怎樣執(zhí)行多線(xiàn)程,但是得到一個(gè)莫名奇妙的結(jié)果。思考了很長(zhǎng)時(shí)間,還是沒(méi)有解決,希望能得到幫助;

2、代碼如下

   public class StudentDemo {
        public static void main(String[] args) {
            Student s = new Student();

            SetThread st = new SetThread(s);
            GetThread gt = new GetThread(s);
        
            Thread t1 = new Thread(st, "SetTread");
            Thread t2 = new Thread(gt,"GetTread");
        
            t2.start();
            t1.start();
        }
    }

    public class Student {
        public String  name;
        public int age;
    }

    public class SetThread implements Runnable{
        private Student s;

        public SetThread(Student s) {
            this.s = s;
        }

        @Override
        public void run() {
           s.name = "jzian";
           s.age = 27;
        }
    }

    public class GetThread implements Runnable {
        private Student s;

        public GetThread(Student s) {
           this.s = s;
        }

        @Override
        public void run() {
            System.out.println( s.name + "-----" + s.age);
        }
    }

3、得到的結(jié)果為:
null----27
請(qǐng)問(wèn)是怎樣得到這樣的結(jié)果的?

回答
編輯回答
野橘

java多線(xiàn)程調(diào)度方式默認(rèn)是搶占式。線(xiàn)程t1執(zhí)行到一半(給age賦完值),這時(shí)候t2搶到了執(zhí)行權(quán),打印出來(lái)就只有age,name為String類(lèi)型的默認(rèn)值。

2017年6月24日 12:07
編輯回答
維他命

子線(xiàn)程s1和s2的執(zhí)行順序不確定,所以你說(shuō)的結(jié)果是可能的結(jié)果中的一種

2018年6月5日 20:36
編輯回答
挽歌

這個(gè)應(yīng)該與指令重排序沒(méi)有關(guān)系。編譯器在某些情況下會(huì)對(duì)指令的順序進(jìn)行重排,但是肯定是基于一定的理由。這段代碼我看不出來(lái)為什么要重排指令順序。

我認(rèn)為原因很可能出在可見(jiàn)性上。兩個(gè)變量都不是volatile的,因此無(wú)法保證在一個(gè)線(xiàn)程中賦值后在另一個(gè)線(xiàn)程中一定可見(jiàn)??梢試L試加上volatile,然后看看還會(huì)不會(huì)出現(xiàn)這種情況。如果不會(huì)出現(xiàn),那么就與指令重排無(wú)關(guān)

2017年12月20日 16:03
編輯回答
淺淺

問(wèn)題出在這里
t2.start();
t1.start();

線(xiàn)程先執(zhí)行g(shù)et方法,set方法你還沒(méi)設(shè)值,所以默認(rèn)是null和0,為什么有時(shí)候有值呢,由于線(xiàn)程隨機(jī)性,有時(shí)候t1先執(zhí)行,t2后執(zhí)行,就得到27,zjan
先這樣改
t1.start();
t2.start();
如果要保證得到的都是27,zjan還要保證線(xiàn)程同步性,上面說(shuō)的加關(guān)鍵字volatie以及synchronize都能解決
手機(jī)碼字,見(jiàn)諒

2018年8月13日 22:38