当前位置: 首页 > article >正文

【多线程面试题 八】、说一说Java同步机制中的wait和notify

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。

面试官:说一说Java同步机制中的wait和notify

参考答案:

wait()、notify()、notifyAll()用来实现线程之间的通信,这三个方法都不是Thread类中所声明的方法,而是Object类中声明的方法。原因是每个对象都拥有锁,所以让当前线程等待某个对象的锁,当然应该通过这个对象来操作。并且因为当前线程可能会等待多个线程的锁,如果通过线程来操作,就非常复杂了。另外,这三个方法都是本地方法,并且被final修饰,无法被重写,并且只有采用synchronized实现线程同步时才能使用这三个方法。

wait()方法可以让当前线程释放对象锁并进入阻塞状态。notify()方法用于唤醒一个正在等待相应对象锁的线程,使其进入就绪队列,以便在当前线程释放锁后竞争锁,进而得到CPU的执行。notifyAll()方法用于唤醒所有正在等待相应对象锁的线程,使它们进入就绪队列,以便在当前线程释放锁后竞争锁,进而得到CPU的执行。

每个锁对象都有两个队列,一个是就绪队列,一个是阻塞队列。就绪队列存储了已就绪(将要竞争锁)的线程,阻塞队列存储了被阻塞的线程。当一个阻塞线程被唤醒后,才会进入就绪队列,进而等待CPU的调度。反之,当一个线程被wait后,就会进入阻塞队列,等待被唤醒。


http://www.kler.cn/a/108686.html

相关文章:

  • kafka面试题解答(四)
  • css:盒子模型
  • 数据挖掘(九)
  • ubuntu中apt-get的默认安装路径。安装、卸载以及查看的方法总结
  • 4.4 软件设计:UML顺序图
  • Redis高可用-主从复制
  • 如何借助数据集更好的评估NLP模型的性能?
  • 【数据结构】数组和字符串(九):稀疏矩阵的链接存储:十字链表的插入、查找、删除操作
  • 大数据可视化BI分析工具Apache Superset实现公网远程访问
  • 【数据结构】Map和Set
  • 深入浅出排序算法之基数排序
  • OS的Alarm定时器调度机制
  • oracle,CLOB转XML内存不足,ORA-27163: out of memory ORA-06512: at “SYS.XMLTYPE“,
  • Think-Queue3一直提示[Exception]redis扩展未安装
  • 开源B2B网站电子商务平台源码下载搭建 实现高效交易的桥梁
  • Kotlin数据流概览
  • server2012 通过防火墙开启局域网内限定IP进行远程桌面连接
  • 工作组与域
  • 基于SSM的汽车维修管理系统
  • 透明安全地解释Moonbeam基金会分配的GLMR去了哪
  • 【K8S】常用的 Kubernetes(K8S)指令
  • LV.12 D12 GPIO实验 学习笔记
  • Makefile泛谈
  • 9、电路综合-基于简化实频的任意幅频响应的微带电路设计
  • 【zookeeper】zk的ZAB原子广播协议
  • C语言实现输入一个字符串,递归将其逆序输出