1
hand515 2018-02-13 23:11:50 +08:00
你没 join
|
2
sagaxu 2018-02-13 23:12:01 +08:00 via Android
第一个线程执行完,while 已经不成立了
|
3
bxb100 2018-02-13 23:13:36 +08:00 via Android
因为你的 while 循环啊
|
4
hand515 2018-02-13 23:14:40 +08:00 2
我上面说错了,你线程 1 已经吧 num 减到 0,线程 2 的 while 进不去
|
5
pwrliang 2018-02-13 23:56:31 +08:00 2
首先,synchronized 保护的是共享资源,你只创建了一个 TxtThread 实例这是对的,但这里面所有的成员变量都被这两个线程共享,也包括 num,但是你对 num--,这个操作不是原子操作,会造成 race condition,你应该用 AtomicInteger 之类的库。最后不要用 sleep 来等待线程完成,sleep 是不可靠的不一定保证 1000ms 后线程会被调度。应该用 join
|
6
mengxh1990 OP @hand515 多谢指教
|
7
mengxh1990 OP @sagaxu 是的,num 被两个线程共享,第一个线程已经把它改变了,thx~
|
8
mengxh1990 OP @pwrliang 感谢指教,这里忽略了 num 是被两个线程共享的,第一个线程已经把 num 减为 0,第二个线程的循环条件就不成立了。另外,你提到的对 num 的操作会造成 race condition,这个竞争应该不会发生吧?因为 synchronized 已经保证了只有一个线程能访问到这块代码,即只有一个线程可以操作到成员变量 num,所以在 synchronized 的保护下,应该不会存在 num 上的竞争吧。不知道理解的对不对,还望指教。
|