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个线程。如果我错了,请纠正我。
答案 0 :(得分:10)
你有竞争条件。有时主线程获胜,有时测试线程获胜。
程序中有2个线程,其中只有一个由程序实例化。主线程由jvm创建,并正在执行main()
方法。然后你的代码实例化一个测试线程并执行它。
答案 1 :(得分:3)
程序代码启动一个线程。 JVM本身启动了几个:主线程,GC线程等。
输出可以是0或1,因为System.out.println
行可能在i=1
行之前或之后执行。您绝对不能保证,因为没有使用同步。并且由于共享i
变量由两个线程访问而没有任何类型的同步,即使在另一条指令之前执行i=1
,主线程仍然可以看到0作为{{1}的值}。
这是非常复杂的东西,如果你真的想要理解Java中的并发性,你应该读一本关于它的好书,例如Brian Goetz的 Java inurrency 。
答案 2 :(得分:2)
两个应用程序线程
“主要”主题
由tTest.start()
我猜测程序sometines打印0,有时打印1作为线程调度的结果。有些主线程在tTest线程进入run方法之前会到达System.out.println语句,有时它不会。