问题来自http://www.javacertifications.net/javacert/scjp1.6Mock.jsp

问题-20

以下代码的输出是什么?

public class Test extends Thread
{
    static String sName = "good";
    public static void main(String argv[])
    {
        Test t = new Test();
        t.nameTest(sName);
        System.out.println(sName);
    }
    public void nameTest(String sName)
    {
        sName = sName + " idea ";
        start();
    }
    public void run()
    {
        for(int i=0;i  <  4; i++)
        {
            sName = sName + " " + i;

        }
    }
}

选项
一个好的
B)好主意
C)好主意好主意
正确答案是:A

说明:在使用String的情况下,在本地方法中更改值不会在全局中更改(因为String对象是不可变的)。

最佳答案

没有一个答案是正确的,也没有一个正确的答案。

该问题非常糟糕,因为它混合了两个完全独立的问题:

  • sName方法的nameTest()参数隐藏相同名称的静态变量,并且对局部变量的更改无效。
  • nameTest()启动一个线程,该线程在其run()方法中更改静态变量,而main()方法将输出变量,而无需等待该线程完成。这被称为竞争条件:巧合的是,将打印变量的哪个状态-可能出现以下任何情况:
  • 好的
  • 好0
  • 好0 1
  • 好0 1 2
  • 好0 1 2 3
  • 10-06 14:30