📅  最后修改于: 2023-12-03 15:12:38.612000             🧑  作者: Mango
该题为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 。
以上就是该问题的解决方案。希望对您有所帮助!