qq_27872361 2019-05-17 21:28 采纳率: 0%
浏览 223

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条回答 默认 最新

  • baichangda234 2019-08-09 09:44
    关注

    图片说明

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

    评论

报告相同问题?

悬赏问题

  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用