Java多线程程序疑问:为何count与i变量表现不同?
帮你理清这个多线程困惑
嗨,我来帮你拆解清楚这个问题!先抓住几个核心点,你就能明白为什么会出现这样的结果了。
1. 为什么t2没有从t1结束的位置继续执行?
这是因为每个线程启动后,都会独立完整地执行一遍run()方法里的代码,并不是接力式地延续同一个run()方法的执行流程。
打个比方:你可以把run()方法看成一份打印好的操作手册,t1拿到手册后从头到尾按步骤执行一遍,t2也会拿到同一份手册,从头开始执行所有步骤,而不是等t1做完了,接着t1的最后一步继续做。所以t1的for循环跑完自己的逻辑后,t2的for循环还是会从i=1重新开始,绝对不会从t1结束的i=5继续。
2. count和i的处理方式为什么不一样?
这完全由变量的作用域和存储位置决定:
- 局部变量i:它是定义在
run()方法的for循环里的局部变量,每个线程在执行run()方法时,都会在自己的线程私有栈内存里创建一个属于自己的i变量。也就是说,t1有自己的i,t2也有自己的i,两者是完全独立的两个变量,各自从1循环到4,互相不会干扰。所以t2的i不会继承t1的i的值,而是重新从1开始计数。 - 成员变量count:它是属于
pt这个共享对象的成员变量,存储在堆内存里,是两个线程都能访问到的共享数据。所以t1对count的修改,t2是能看到的。你说程序最终输出是8,说明两个线程都完整执行了累加逻辑——比如t1把count从0加到4,t2再把count从4加到8,这是因为这次运行中两个线程刚好串行执行(t1先跑完,t2才开始),没有出现线程安全的冲突。
另外补充一句:如果你的代码没有加同步机制(比如synchronized),理论上可能出现线程安全问题,比如count的结果可能不是8,而是介于4到8之间的数,但你这里输出8,说明这次运行的线程执行顺序是串行的。
内容的提问来源于stack exchange,提问作者uideveloperui
相关产品推荐
相关产品推荐

