📜  门| GATE CS Mock 2018年|问题17(1)

📅  最后修改于: 2023-12-03 15:12:38.612000             🧑  作者: Mango

GATE CS Mock 2018: Problem 17

该题为GATE CS Mock 2018的第17个问题。该问题与Java多线程和同步相关。下面是问题描述和解决方案。

问题描述

考虑下面的Java程序。

class MyThread extends Thread {
    int k;
    public void run() {
        k = 4;
    }
}
class Test {
    public static void main(String[] args) throws Exception {
        MyThread t = new MyThread();
        t.start();
        t.join();
        System.out.println(t.k);
    }
}

程序的输出是什么?

(A) 0 (B) 4 (C) Compiler error. (D) Runtime error.

解决方案

该程序在主函数中创建了一个线程对象t,这个线程对象是MyThread类的实例。MyThread类继承了Thread类,并重写了run()方法。run()方法将k变量的值设置为4。

public void run() {
    k = 4;
}

在主函数中,线程对象t开始运行并在完成后等待(join)回收。然后,程序输出了t.k的值。需要注意的是,在主函数中,线程对象t在默认情况下对t.k变量使用共享内存,而k的初始值是0。然后线程对象t修改了这个变量的值并将其设置为4,但主函数并不知道这一点。因此,当t.k被输出时,它仍然包含其初始值0,因此程序的输出应为(A) 0 。

正确的程序应该将k变量标记为volatile以确保其在线程之间进行同步,从而产生正确的结果(即(B) 4)。

以下是修改后的代码:

class MyThread extends Thread {
    volatile int k; // make it volatile
    public void run() {
        k = 4;
    }
}

class Test {
    public static void main(String[] args) throws Exception {
        MyThread t = new MyThread();
        t.start();
        t.join();
        System.out.println(t.k);
    }
}

因此,程序的输出是(B) 4 。

以上就是该问题的解决方案。希望对您有所帮助!