请稍等 ...
×

采纳答案成功!

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

count小于100,打印出来却是0--100,

图片描述
感觉有问题,最后100是怎么打印出来的?

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

3回答

悟空 2019-10-28 17:21:06

99的时候,两个线程都进入while,然后一个打印99,然后把99变成了100,另外一个已经在while里面了,不会再判断条件了,所以会把100打印出来。

1 回复 有任何疑惑可以回复我~
提问者 坂田渣渣辉 2019-10-28 19:46:00
package threadcoreknowledge.createthreads;

public class PrintTest {

    private static   int count ;
    private static final Object lock = new Object();

    public static void main(String[] args){
//        int count = 0;
//        Object lock = new Object();

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

                    }
                }

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

            }
        }, "基数").start();
    }

    public  static void  waitNotify(){
        lock.notifyAll();
        if (count<100){
            try {
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

需要把count放到共享代码块中,


0 回复 有任何疑惑可以回复我~
悟空 2019-10-28 17:21:06

条件是<100,所以99的时候可以进入while,然后count++,count变成100,然后打印出来。

0 回复 有任何疑惑可以回复我~
  • 提问者 坂田渣渣辉 #1
    不应该是先打印了99,然后在++的吗
    按这个解释0进来的,打印的就是1了。
    回复 有任何疑惑可以回复我~ 2019-10-28 17:25:32
  • 悟空 回复 提问者 坂田渣渣辉 #2
    不好意思刚才说错了,是99的时候,两个线程都进入while,然后一个打印99,然后把99变成了100,另外一个已经在while里面了,不会再判断条件了,所以会把100打印出来。
    回复 有任何疑惑可以回复我~ 2019-10-28 17:58:48
  • 提问者 坂田渣渣辉 回复 悟空 #3
    那这个同步块的范围是不是要调整一下,比如把while也包进去;但是把while放同步代码块,又会卡着不动
    回复 有任何疑惑可以回复我~ 2019-10-28 19:16:01
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信