csdn_sqj
2020-05-10 17:12
采纳率: 60.3%
浏览 134
已采纳

java-多线程-两个问题

图片说明
+++
图片说明

+++
一、
图一中,为什么a=0时,没有触发if判断?反应不过来?
二、
图二中,为什么最后触发中断,还会有线程执行一次?怎么避免?

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • threenewbee 2020-05-10 19:16
    已采纳

    (1)if (o == 0)这个操作不是原子性的,你又没有同步。
    线程得到0的值为0,然后另一个线程正好改写了o,这样前一个得到的其实是脏数据
    (2)你break只是不再创建新的线程了,但是不能让正在运行的线程停下来。
    除非你向已经运行的线程发送interrupt,让它们自行退出或者被迫中止

    已采纳该答案
    打赏 评论
  • 农夫丶果园 2020-05-11 08:36

    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线程的时候 , 把你创建的线程也都退出

    打赏 评论

相关推荐 更多相似问题