2024年150道高频Java面试题(三十一)

61. sleep() 和 wait() 有什么区别?

sleep()wait() 方法在Java中被广泛用于线程控制,它们都可以让线程暂停执行一段时间,但它们之间存在一些重要的区别:

  1. 所属类
    • sleep()Thread 类的静态方法。
    • wait()Object 类的方法。
  2. 使用范围
    • sleep() 可以在任何地方使用,因为它属于 Thread 类。
    • wait() 必须在同步上下文中调用,即必须在获取了对象锁的代码块中使用,通常用在对象的同步方法或同步代码块中。
  3. 释放锁
    • sleep() 不会释放当前线程所持有的锁资源。
    • wait() 会立即释放当前线程持有的锁资源,直到另一个线程调用同一个对象的 notify()notifyAll() 方法来唤醒它。
  4. 精度
    • sleep() 方法通常用于短时间等待,它能够指定具体的等待时间(毫秒或纳秒),并且能够较为准确地控制唤醒时间。
    • wait() 方法没有参数,它通常用于线程间的通信,等待其他线程的通知,等待的时间是不确定的。
  5. 方法调用
    • 调用 sleep() 方法不需要当前线程拥有任何锁。
    • 调用 wait() 方法必须在拥有对象的锁的情况下进行。
  6. 唤醒方式
    • sleep() 方法到达指定时间后自动唤醒。
    • wait() 方法需要其他线程调用对象的 notify()notifyAll() 来唤醒。

以下是 sleep()wait() 的代码示例:

// sleep() 方法示例
Thread thread = new Thread(() -> {try {Thread.sleep(1000); // 休眠1秒} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程被唤醒");
});// wait() 方法示例
Object lock = new Object();
new Thread(() -> {synchronized (lock) {try {lock.wait(); // 等待} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程通过notify()被唤醒");}
}).start();// 在另一个线程中唤醒wait()的线程
new Thread(() -> {synchronized (lock) {lock.notify(); // 唤醒等待的线程}
}).start();

在使用 wait()notify() 时,通常需要紧密协调以确保线程安全,而 sleep() 更适合于简单的定时等待场景。

62. notify() 和 notifyAll()有什么区别?

notify()notifyAll() 是Java中用于线程同步的Object类的方法,它们用于唤醒等待同一共享资源的线程。

notify() 方法:

  • 它会随机选择一个在对象监视器上等待的线程,并通知该线程,使其从等待状态进入可运行状态。
  • 选择哪个线程是由JVM决定的,并且是不可预测的。
  • 如果没有线程在等待,notify()调用不会有任何效果。
  • 在被通知的线程重新获得对共享资源的访问权限并退出同步块之前,其他线程仍然处于阻塞状态。

notifyAll() 方法:

  • 它会通知所有在该对象监视器上等待的线程,使它们从等待状态进入可运行状态。
  • 这样,所有等待的线程都有机会获取共享资源,并继续执行。
  • 如果没有线程在等待,notifyAll()调用同样不会有任何效果。

以下是这两个方法的使用场景和区别的总结:

对比项notify()notifyAll()
通知的线程数量通知单个线程通知所有等待的线程
使用场景当只有一个线程需要被唤醒时,以避免不必要的上下文切换当多个线程都在等待同一条件时,需要唤醒所有线程
效率可能更高效,因为它不需要唤醒所有线程可能导致上下文切换次数增多,但确保了所有等待线程都有机会运行
死锁风险如果选择错误的线程可能会增加死锁的风险适用于多个线程需要被唤醒的场景,降低了死锁的风险

以下是这两个方法的一个简单代码示例:

public class SharedObject {public synchronized void doSomething() {// 假设这里是需要共享资源的代码块// ...// 通知正在等待的线程(单个或所有)this.notify(); // 或者 this.notifyAll();}
}public class ThreadA extends Thread {private SharedObject sharedObject;public ThreadA(SharedObject sharedObject) {this.sharedObject = sharedObject;}@Overridepublic void run() {synchronized(sharedObject) {try {// 等待,直到被notify()或notifyAll()唤醒sharedObject.wait();} catch (InterruptedException e) {e.printStackTrace();}// 执行共享资源操作sharedObject.doSomething();}}
}

在以上代码中,notify()notifyAll()可以在doSomething()方法中互换使用,但它们的效果和适用场景会有明显的不同。

有帮助请点赞收藏呀~

领【150 道精选 Java 高频面试题】请 go 公众号:码路向前 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/825133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

发布 Chrome/Edge浏览器extension扩展到应用商店

Chrom Extension发布流程 创建和发布自定义 Chrome 应用和扩展程序:https://support.google.com/chrome/a/answer/2714278?hlzh-Hans 在 Chrome 应用商店中发布:https://developer.chrome.com/docs/webstore/publish?hlzh-cn 注册开发者帐号&#…

图解CPU的实模式与保护模式

哈喽,大家好,我是呼噜噜,好久没有更新old linux了,在上一篇文章Linux0.12内核源码解读(7)-陷阱门初始化中,我们简要地提及了中断,但是中断机制在计算机世界里非常重要,处处都离不开中断&#xf…

Element——组件

element官网 https://element.eleme.cn/#/zh-CN/component/layout vscode格式化快捷键&#xff1a;shiftaltf table表格 <template><el-table:data"tableData"style"width: 100%"><el-table-columnprop"date"label"日期…

富格林:可信方式识破受害暗箱

富格林认为&#xff0c;现货黄金正是得宠的投资产品&#xff0c;目前不断有投资新手加入现货黄金投资市场。俗话说万事开头难&#xff0c;对于新手来说&#xff0c;掌握入市相关的可信知识识破受害暗箱是决定投资能获利的关键因素。那么&#xff0c;有哪些可信知识可以帮助我们…

博客摘录「 perf工具使用统计函数调用」2024年4月18日

性能调优时&#xff0c;我们通常需要分析查找到程序百分比高的热点代码片段&#xff0c;这便需要使用 perf record 记录单个函数级别的统计信息&#xff0c;并使用 perf report 来显示统计结果。 只要两条指令&#xff1a; sudo perf record -e cpu-clock -g -p 123456 sudo …

Git使用总结(不断更新中)

branch 本地分支操作 删除本地分支 git branch -d <local-branch-name>远端分支操作 从远端分支创建本地分支 git checkout -b <local-branch-name> origin/<remote-branch-name>git ignore 如果工程的代码文件中有不希望上传到远端的文件&#xff0c;…

排列特征重要性(Permutation Feature Importance)

5个条件判断一件事情是否发生&#xff0c;每个条件可能性只有2种&#xff08;发生或者不发生&#xff09;&#xff0c;计算每个条件对这件事情发生的影响力。排列特征重要性模型的程序。 例一 在机器学习领域&#xff0c;排列特征重要性&#xff08;Permutation Feature Impor…

php简单路由实现伪静态

#伪静态作用# 增强搜索引擎的友好性&#xff1a;通过改变动态网页的URL&#xff0c;使之看起来像静态网页&#xff0c;伪静态技术有助于提高网站在搜索引擎中的表现&#xff0c;使网站内容更易被搜索引擎抓取和索引。提升用户信任度和体验&#xff1a;伪静态的URL后缀方式与静…

【honggfuzz学习笔记】honggfuzz的基本特性

本文架构 1.动机2.honggfuzz的基本概念官网描述解读 3. honggfuzz的反馈驱动(Feedback-Driven)软件驱动反馈&#xff08;software-based coverage-guided fuzzing&#xff09;代码覆盖率代码覆盖率的计量单位 代码覆盖率的统计方式 硬件驱动反馈&#xff08; hardware-based co…

CTFHUB RCE作业

题目地址&#xff1a;CTFHub 完成情况如图&#xff1a; 知识点&#xff1a; preg_match_all 函数 正则匹配函数 int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags PREG_PATTERN_ORDER [, int $offset 0 ]]] )搜索 subject 中…

【Python小游戏】植物大战僵尸的实现与源码分享

文章目录 Python版植物大战僵尸环境要求方法源码分享初始化页面&#xff08;部分&#xff09;地图搭建&#xff08;部分&#xff09;定义植物类 &#xff08;部分&#xff09;定义僵尸类&#xff08;部分&#xff09;游戏运行入口 游戏源码获取 Python版植物大战僵尸 已有的植…

resume

通过添加 --resume 参数&#xff0c;用户可以在命令行中指定一个检查点文件的路径&#xff0c;用于恢复之前训练的模型状态。如果用户不指定 --resume 参数&#xff0c;则默认值为空字符串。 python train.py train multi_resnet18_kd --resume ./save_checkpoints/multi_resn…

Git:远程仓库名称变更本地无法提交解决

报错信息 blog % git push To github.com:hannah-lin-sama/web-docs.git! [rejected] main -> main (non-fast-forward) 错误&#xff1a;无法推送一些引用到 github.com:hannah-lin-sama/web-docs.git 提示&#xff1a;更新被拒绝&#xff0c;因为您当前分支的最新…

JavaScript中处理回调与状态更新

JavaScript中处理高速回调与状态更新的问题分析与解决方案 在JavaScript编程中&#xff0c;处理高速执行的回调函数时常会遇到状态管理的问题&#xff0c;尤其是在处理数组或其他共享数据结构时。这些问题通常因为JavaScript的异步执行特性以及共享状态的可变性引起。下面将分…

git工具的安装及使用

git工具的安装及使用 一、安装git工具 Windows下安装git工具&#xff1a;在Windows下打开以下网址&#xff0c;直接下载安装软件即可。https://gitforwindows.org/ 在ubuntu下安装git工具&#xff1a;保证ubuntu能正常上网的前提下&#xff0c;直接使用以下命令安装git工具即…

基于混合算法的冬枣果型分级研究与实践

如题&#xff0c;这是一个学生的课题&#xff0c;如果写论文可以从以下角度展开&#xff1a; 一、引言 1. 研究背景及意义 2. 国内外研究现状 3. 研究目标与内容 二、冬枣果型分级现状及挑战 1. 冬枣果型分级的重要性 2. 传统分级方法的局限性 3. 机器学习和深度学习在果型分级…

解决拉格朗日四平方和定理

1 问题 “拉格朗日四平方数和定理”是数学中著名的一个定理&#xff0c;其内容为&#xff1a;任意一个正整数均可表示为四个整数的平方和(其中有些整数可以为零)。要求输入一个数&#xff0c;找出所有符合该定理的四个整数&#xff1f; 2 方法 可以通过“四平方数和定理”的含义…

【Proteus】51单片机对直流电机的控制

直流电机&#xff1a;输出或输入为直流电能的旋转电机。能实现直流电能和机械能互相转换的电机。把它作电动机运行时是直流电动机&#xff0c;电能转换为机械能&#xff1b;作发电机运行时是直流发电机&#xff0c;机 械能转换为电能。 直流电机的控制&#xff1a; 1、方向控制…

动态多目标测试函数DF1-DF14,FDA1-FDA5,SDP1-SDP12的TurePOF(MATLAB代码)

动态多目标测试函数FDA1、FDA2、FDA3、FDA4、FDA5的turePOF&#xff08;MATLAB代码&#xff09; 动态多目标测试函数DF1-DF14的turePOF变化&#xff08;提供MATLAB代码&#xff09; 动态多目标测试函数SDP1-SDP12的TurePOF变化视频&#xff08;含MATLAB代码及参考文献&#xff…

Android Compose使用AndroidView,并将 AndroidView 保存成图片。

谢谢关注&#xff01;&#xff01; 前言&#xff1a;上一篇文章主要介绍HarmonyOs开发之———容器组件使用 http://t.csdnimg.cn/r9Qd1 一、使用 AndroidView //images 是一个 uri数组var androidView by remember { mutableStateOf<View?>(null) }AndroidView(facto…