-5
public class ThreadTest extends Thread
{
    int i=0;

    public void run()
    {
        i=1;
    }

    public static void main(String... args)
    {
        ThreadTest tTest=new ThreadTest();
        tTest.start();

        System.out.println(tTest.i);
    }
}

为什么有时会打印 1 有时会打印 0?在这个程序中会创建多少个线程?据我了解,将在该程序中创建 2 个线程。如果我错了,请纠正我。

4

3 回答 3

10

你有一个竞争条件。有时主线程获胜,有时测试线程获胜。

程序中有2个线程,其中只有一个被程序实例化。主线程由 jvm 创建并正在执行该main()方法。然后您的代码实例化一个测试线程并执行它。

于 2013-06-28T17:18:25.347 回答
3

程序代码启动一个线程。JVM本身启动了几个:主线程、GC线程等。

输出可能是 0 或 1,因为该System.out.println行可能在该i=1行之前或之后执行。你绝对不能保证,因为没有使用同步。而且由于共享i变量是由两个线程访问而没有任何同步,即使i=1在另一条指令之前执行,主线程仍然可以看到 0 的值i

这是相当复杂的东西,如果你真的想了解 Java 中的并发性,你应该阅读一本关于它的好书,比如Brian Goetz 的Java concurrency in Practice

于 2013-06-28T17:21:36.583 回答
2

Two application threads

  • the "main" thread

  • the one started by tTest.start()

I would guess that the program sometines prints 0 and sometimes prints 1 as a result of the scheduling of the threads. Sometiomes the main thread will reach the System.out.println statement before the tTest thread has entered the run method, sometimes it won't.

于 2013-06-28T17:20:31.373 回答