您当前的位置: 首页 >  Java

java持续实践

暂无认证

  • 1浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Java多线程 Object类的wait notify notifyAll常见面试问题

java持续实践 发布时间:2020-08-30 10:06:16 ,浏览量:1

文章目录
      • Object类的wait notify notifyAll常见面试问题

Object类的wait notify notifyAll常见面试问题
  • 手写生产者消费者设计模式 . 如下的链接中已有代码实现 https://javaweixin6.blog.csdn.net/article/details/108298131 代码多敲几遍, 再手写, 也可以在面试中, 被问到熟悉什么设计模式的时候, 也可以说熟悉生产者消费者模式, 再引出wait notify.

  • 为什么wait 需要在同步代码块中使用, 而sleep不需要 主要是为了线程间通信的可靠, 防止死锁或者线程永久等待唤醒的发生 . 如果不把wait放入同步代码块中的话, 在wait执行之前, CPU的调度可能会把线程切换到另外一个notify的线程了,但是此时其实是没有wait中的线程的, 如果执行了notify线程后, 再执行wait, 那么会造成线程的永久等待唤醒. 而sleep是本身线程的休眠, 与其他线程的关系不大, 因此不需要放入同步代码块中.

  • 为什么wait notify notifyAll是定义在Object类 , 而 sleep是定义在Thread类中 主要是因为 wait notify notifyAll 是一个锁级别的操作, 每一个对象, 在对象头中,都会有数据保存当前锁的状态的. 因此锁是绑定在某个对象中, 而不是线程中的. 反之 ,如果把wait notify notifyAll 定义在Thread中, 那么就会造成一定的局限性, 每一个线程虽然可以休眠, 每一个线程也可以持有多个锁, 并且这些锁是相互配合的 , 如果把wait定义在Thread类中, 就无法实现灵活的逻辑.

  • wait属于Object 对象, 如果调用Thread.wait会发生什么? 由于Java中所有的类,都是继承于Obejct类的, 因此Thread.wait 也能使得线程进入等待状态 . 但是Thread类比较特殊的是, 线程退出的时候, 会自动的去执行notify , 这样会使得代码的流程受到干扰. 因此创建锁对象和调用wait方法的时候, 不要用Thread类.

  • 如何选择使用notify 还是notifyAll 之前的文章中, 已经对此有提到是选择使用notify 还是notifyAll. 如果是唤醒一个线程 ,就使用notify ,如果是多个线程, 那么就是notifyAll https://javaweixin6.blog.csdn.net/article/details/108295773

  • notifyAll之后所有的线程都会再次的抢夺锁, 如果某线程抢夺失败会怎么办? notifyAll之后所有的线程都会再次的抢夺锁 , 只是回到了最初使的状态. 如果没有抢到锁, 就只会进入等待的状态, 等待其他的线程,释放锁, 再去抢锁, 或者再去接受线程调度器的调度. 直到去拿到这把锁.

  • 用suspend 和resume方法, 可以用来阻塞线程吗, 为什么 suspend 和resume方法 已经由于安全问题, 被弃用了 , 推荐使用wait 和notify来实现 休眠和唤醒的功能.

关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

1.1689s