请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师这段代码 如果将if提取到synchronized外面有几率输出不到100 这是因为?

/**

  • 两个线程交替打印100以内奇偶数 使用 syn方式实现 如果将if提取的synchronized外面有几率输出不到100 这是因为?
    */
    public class WaitNotifyPrintOddEvenSyn {
    private static int count = 0;
    private static final Object lock = new Object();

    /**

    • 1创建2个线程 2实现奇偶数输出

    • @param args
      */
      public static void main(String[] args) {

      new Thread(new Runnable() {
      @Override
      public void run() {
      while (count < 100) {
      if ((count & 1) == 0) {
      synchronized (lock) {
      System.out.println(Thread.currentThread().getName() + “:” + count++);
      }
      }
      }
      }
      }, “偶数”).start();

      new Thread(new Runnable() {
      @Override
      public void run() {
      while (count < 100) {
      if ((count & 1) == 1) {
      synchronized (lock) {
      System.out.println(Thread.currentThread().getName() + “:” + count++);
      }
      }
      }
      }
      }, “奇数”).start();
      }
      -------------------如下图说所示,上述代码把if的流程控制包在synchronized代码块儿外几率输出不到100---------------------
      图片描述

正在回答 回答被采纳积分+3

1回答

悟空 2020-03-09 15:38:09

因为while里面就是小于100的条件,到99就停了

0 回复 有任何疑惑可以回复我~
  • 提问者 慕设计10038 #1
    嗯,就是为什么这样写出几率出现99停或者100停?  因为有的时候会到100 多次执行几次不一样,但是同样的条件如果把if放在synchronized里就是次次到100
    回复 有任何疑惑可以回复我~ 2020-03-10 09:29:53
  • 悟空 回复 提问者 慕设计10038 #2
    如果两个线程过了while之后都过了if,就是打印100,否则就是99,因为打印偶数的线程会发现if条件不满足,不再打印100了。你用断点debug一下就会很清楚的。
    回复 有任何疑惑可以回复我~ 2020-03-10 10:30:37
  • 为什么会两个同时过if呢?count只有为奇数或者为偶数啊
    回复 有任何疑惑可以回复我~ 2020-06-09 15:22:43
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信