java新手求助一个关于多线程的奇怪问题

这里是四条线程,有两种写法,一种各两条.执行结果是:一旦A与B连着出现,CD就始终无法获取CPU执行权.不解为啥会出现这种问题.while在synchronized外面的线程为什么会获取不到执行权了(我自己琢磨出这个结果的),或者说是别的问题导致这种结果.
按道理,不是每次有线程synchronized代码块内执行了obj.wait(),其他线程都会去争夺CPU执行权,那CD线程也是可以抢到的,只是它每次唤醒拿到锁,拿到执行权的时候,在wait()处重新开始执行,下一步就是结束synchronized代码块,释放锁.重新开始while循环,需要重新获取锁才可以进入synchronized代码块.
为什么一旦AB线程相连出现,CD线程就不执行了呢??????

public class Demo {

    public static Object obj = new Object();

    public static void main(String[] args) {
        new Thread(()-> {
            while(true){
                System.out.println("-----------------CC线程------------------");
                synchronized (obj){
                    System.out.println("---------------------CCCCCCCC-----------");
                    obj.notifyAll();
                    try {
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

        new Thread(()-> {
            while(true){
                System.out.println("-------------DD线程--------------------");
                synchronized (obj){
                    System.out.println("-----------------DDDDDD-------------");
                    obj.notifyAll();
                    try {
                        obj.wait();//B抢到CPU 抢到锁 才此处唤醒
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

        new Thread(()-> {
            synchronized (obj){
                while(true){
                System.out.println("-------------------AA线程---------------------");

                    obj.notifyAll();
                    try {
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

        new Thread(()-> {
            synchronized (obj){
                while(true){
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("--------------BB线程-----------");
                    obj.notifyAll();
                    try {
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

    }
}

执行结果

1个回答

图片说明

没有任何问题,你日志查看错了吧

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐