+++
+++
一、
图一中,为什么a=0时,没有触发if判断?反应不过来?
二、
图二中,为什么最后触发中断,还会有线程执行一次?怎么避免?
(1)if (o == 0)这个操作不是原子性的,你又没有同步。
线程得到0的值为0,然后另一个线程正好改写了o,这样前一个得到的其实是脏数据
(2)你break只是不再创建新的线程了,但是不能让正在运行的线程停下来。
除非你向已经运行的线程发送interrupt,让它们自行退出或者被迫中止
1) 每次循环都启动两个线程 , 每个线程去递减a的值 ; 理想情况下 , 第五次循环结束 a 就应该等于0 ;
但这是多线程环境, 所以可能出现这种情况 , 第五次循环中, 第一个线程把a减为1, 第二个线程还没执行但是main线程先执行了
进入了第六次循环 , 就会判断 a == 0为false, 此时第五次循环的第二个线程执行了使得a=0, 但是第六次循环也创建两个线程去递减a ,
所以a==0这个条件被main线程错过了 , 永远不会进入这个判断 , 直到30次循环结束 ;
2) 同理 , 可能出现这种情况 , 在main线程触发的时候之前有线程正好把 a 递减到了0 , 触发了中断 , main线程结束 , 但是之前还有遗留
线程没运行, 所以切换到遗留线程的执行 , 此时a = 10, 递减就是 9 ; 除非你在退出main线程的时候 , 把你创建的线程也都退出