Java高頻面試之并發編程-08

hello啊,各位觀眾姥爺們!!!本baby今天來報道了!哈哈哈哈哈嗝🐶

面試官:說說sleep和wait的區別?


1. 核心區別總結

特性sleep()wait()
所屬類Thread 類的靜態方法Object 類的實例方法
鎖的釋放不釋放鎖(保持當前線程持有的鎖)釋放鎖(讓其他線程獲取鎖)
調用條件可在任何地方調用必須在 synchronized 同步塊或方法中調用
喚醒機制時間到自動喚醒需其他線程調用 notify()/notifyAll()
作用范圍控制線程休眠用于線程間通信(協調共享資源訪問)
異常處理需捕獲 InterruptedException需捕獲 InterruptedException

2. 詳細對比

(1) 鎖的行為
  • sleep()
    線程調用 sleep() 后進入休眠狀態,但不會釋放已持有的鎖。其他線程無法獲取該鎖,可能導致阻塞。

    synchronized (lock) {Thread.sleep(1000); // 持有鎖休眠,其他線程無法進入同步塊
    }
    
  • wait()
    調用 wait() 會立即釋放當前對象的鎖,允許其他線程獲取鎖并執行同步代碼塊。

    synchronized (lock) {lock.wait(); // 釋放鎖,其他線程可進入同步塊
    }
    
(2) 使用場景
  • sleep()
    用于讓線程暫停執行一段時間(如定時任務、模擬延遲)。

    // 定時任務:每秒執行一次
    while (true) {doTask();Thread.sleep(1000); // 休眠 1 秒
    }
    
  • wait()
    用于線程間協作,等待某個條件滿足(如生產者-消費者模型)。

    // 消費者等待隊列非空
    synchronized (queue) {while (queue.isEmpty()) {queue.wait(); // 釋放鎖,等待生產者通知}queue.poll();
    }
    
(3) 喚醒機制
  • sleep()
    休眠時間結束后自動恢復,或通過 interrupt() 中斷休眠(拋出 InterruptedException)。

  • wait()
    必須由其他線程調用同一對象的 notify()notifyAll() 喚醒,或等待超時(若指定了時間)。


3. 代碼示例

sleep() 示例
public class SleepDemo {public static void main(String[] args) {new Thread(() -> {synchronized (SleepDemo.class) {System.out.println("線程 A 獲取鎖,開始休眠 3 秒");try {Thread.sleep(3000); // 休眠但不釋放鎖} catch (InterruptedException e) {e.printStackTrace();}System.out.println("線程 A 喚醒");}}).start();new Thread(() -> {synchronized (SleepDemo.class) {System.out.println("線程 B 獲取鎖");}}).start();}
}

輸出

線程 A 獲取鎖,開始休眠 3 秒  
(等待 3 秒后)  
線程 A 喚醒  
線程 B 獲取鎖

現象:線程 B 必須等待線程 A 釋放鎖后才能執行。

wait() 示例
public class WaitDemo {public static void main(String[] args) {Object lock = new Object();new Thread(() -> {synchronized (lock) {System.out.println("線程 A 獲取鎖,并等待");try {lock.wait(); // 釋放鎖} catch (InterruptedException e) {e.printStackTrace();}System.out.println("線程 A 被喚醒");}}).start();new Thread(() -> {synchronized (lock) {System.out.println("線程 B 獲取鎖,喚醒線程 A");lock.notify();}}).start();}
}

輸出

線程 A 獲取鎖,并等待  
線程 B 獲取鎖,喚醒線程 A  
線程 A 被喚醒

現象:線程 A 調用 wait() 后釋放鎖,線程 B 可以獲取鎖并喚醒線程 A。


4. 常見問題與注意事項

  1. 為什么 wait() 必須在同步塊中調用?

    • wait()notify() 依賴于對象的監視器鎖(Monitor),調用前必須獲取鎖,否則拋出 IllegalMonitorStateException
    • 這是為了避免競態條件(Race Condition),確保線程在安全狀態下等待或喚醒。
  2. sleep() 是否會釋放鎖?

    • 不會sleep() 是線程自身的行為,與鎖無關。
  3. 如何選擇 sleep()wait()

    • 需要暫停線程但不涉及鎖協調sleep()
    • 需要線程間協作并釋放鎖wait() + notify()
  4. 避免死鎖

    • 若線程調用 wait() 后未被喚醒,將永久阻塞。確保邏輯中始終有喚醒機制。

總結

  • sleep():單純讓線程休眠,不涉及鎖協調,適用于定時任務或延遲操作。
  • wait():用于線程間通信,需與 notify() 配合,確保共享資源的安全訪問。
  • 核心區別sleep() 不釋放鎖,wait() 釋放鎖。
    在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78495.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78495.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78495.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring-Ai-McpSever從外到內

MCP是什么 Model Context Protocol (MCP) 是一個開放協議,它使 LLM 應用與外部數據源和工具之間的無縫集成成為可能。無論你是構建 AI 驅動的 IDE、改善 chat 交互,還是構建自定義的 AI 工作流,MCP 提供了一種標準化的方式,將 LL…

ubuntu22.04 命令行修改靜態ip

傳統interfaces文件配置(適用于舊版)即便我們已經在桌面上配置了固定ip 這里也可以修改 ?編輯配置文件? 修改/etc/network/interfaces(需安裝net-tools): # interfaces(5) file used by ifup(8) and ifdown(8) # In…

計算機網絡學習筆記 4-6章

第 4 章 網絡層 【考綱內容】 (一)網絡層的功能 異構網絡互連;路由與轉發;SDN 基本概念;擁塞控制 (二)路由算法 靜態路由與動態路由;距離 - 向量路由算法&#xff1…

力扣hot100_子串_python版本

一、560. 和為 K 的子數組 思路:這就是一道典型的前綴和的題代碼: class Solution:def subarraySum(self, nums: List[int], k: int) -> int:presum [0] * (len(nums) 1)for i, x in enumerate(nums):presum[i 1] presum[i] x # 前綴和序列需要n1個ans 0…

猿人學web端爬蟲攻防大賽賽題第15題——備周則意怠-常見則不疑

解題步驟 1、觀察抓的包 2、有個m參數,一看就是經過處理的,我們得知道m是如何組成的。看Initiator模塊。 3、還是看request函數,往上一看就看到了m的賦值操作。 打斷點,觸發。 4、看下window.m()的定義 5、比較好理解的&#x…

rag增強檢索-基于關鍵詞檢索的混合檢索模式

1. 為什么在 RAG 里要用關鍵詞檢索? 向量檢索(embedding-based retrieval)是找語義相近的內容,但有時候不夠準確。比如用戶問了具體人名、產品型號、年份,這類關鍵詞強指向性的信息,用向量檢索可能匹配不到最相關內容。**關鍵詞檢索(keyword-based retrieval)**可以直接…

純真社區IP庫離線版發布更新

純真社區IP庫離線版發布更新 發布者:技術分享 2005年,隨著中國互聯網的蓬勃發展,純真IP庫誕生了。作為全球網絡空間地理測繪技術的領先者,純真開源項目為中國互聯網行業提供了高質量的網絡空間IP庫數據。純真IP庫目前已經覆蓋超…

GitOps進化:深入探討 Argo CD 及其對持續部署的影響

什么是 GitOps? 雖然軟件開發生命周期的大部分已經實現自動化,但基礎設施仍然在很大程度上依賴于人工,需要專業團隊的參與。隨著當今基礎設施需求的不斷增長,實施基礎設施自動化變得越來越重要。現代基礎設施需要具備彈性&#x…

通過示例學習:連續 XOR

通過示例學習:連續 XOR 如果我們想在 PyTorch 中構建神經網絡,可以使用 (with) 指定所有參數(權重矩陣、偏差向量),讓 PyTorch 計算梯度,然后調整參數。但是,如果我們有很…

百度Create大會深度解讀:AI Agent與多模態模型如何重塑未來?

目錄 百度Create大會亮點全解析:從數字人到Agent生態布局 數字人商業化:從"擬人"到"高說服力"的進化 Agent生態:從"心響"App看百度的Agent戰略布局 "心響"App的技術架構與創新點 多模態大模型&a…

django filter 日期大于當前日期的

在Django中,如果你想要過濾出日期大于當前日期的記錄,你可以使用Django的QuerySet API中的__gt(大于)操作符。這里是如何做到這一點的步驟: 確定你的模型:首先,確保你有一個模型(Mo…

C#本地使用離線ocr庫識別圖片中文本,工具包PaddleOCRSharp

C#本地使用離線ocr庫識別圖片文本,工具包PaddleOCRSharp PaddleOCRSharp介紹 項目地址:https://github.com/raoyutian/PaddleOCRSharp PaddleOCRSharp 是一個.NET版本OCR可離線使用類庫。項目核心組件PaddleOCR.dll目前已經支持C\C、.NET、Python、Go…

缺省處理、容錯處理

布爾判定 假:false 0 null undefined NaN 可選符.?和?? let obj {name: jim,data: {money: 0,age: 18,fn(a){return a}} }1、如果左側的值為null或者undefined,則使用右側值。需要使用"??" obj?.data?.a…

【Java面試題系列02】Java 集合常見面試題

文章目錄 一、前言🚀🚀🚀二、Java 基礎面試題:??????1、說說 Java 中 HashMap 的原理?2、HashMap 的擴容機制?3、為什么 Java 中 HashMap 的默認負載因子是 0.75?4、JDK 1.8 對 HashMap 除了紅黑樹還…

如何創建并使用極狐GitLab 部署令牌?

極狐GitLab 是 GitLab 在中國的發行版,關于中文參考文檔和資料有: 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 部署令牌 (BASIC ALL) 您可以使用部署令牌來啟用部署任務的身份驗證,而與用戶賬戶無關。在大多數情況下&#xf…

OpenGl ES 3.0 筆記一:初步概念

🎯 整體比喻:開一場 3D 打印畫展! 想象你在做一件事情:「拿設計圖,把它畫在一張紙上」。 這整個流程就好像 GPU 在渲染一幅畫。 而下面這幾個階段,就是這場「畫展」里每個具體的人或機器要做的事情&#x…

人類社會的第四階段

本書的主旨是探討一場新的權力革命,它將以20世紀民族國家的毀滅為代價, 解放出個體。創新,以前所未有的方式改變了暴力的邏輯,并且正在革新未來的 邊界。如果我們的推論是正確的,你們正站在一場有史以來最宏大的革命的…

位置差在坐標系間的相互轉換

1 NED轉經緯高 (n 系下的北向、東向和垂向位置差異(單位 m)轉化為緯度、經度和高程分量的差異) 2 基站坐標轉換 緯度、經度、高程 到 ECEF %緯度、經度、高程 到 ECEF clc; clear; glvs; addpath(genpath(E:\GNSSINS\ACES)…

WPF定義擴展屬性和依賴屬性

WPF擴展屬性與依賴屬性詳解 一、依賴屬性(Dependency Property)詳解 1. 什么是依賴屬性? 依賴屬性是WPF框架的核心特性之一,它允許屬性值依賴于: 父元素的屬性值(繼承)樣式和模板動畫數據綁定資源查找2. 依賴屬性的特點 ??屬性值繼承??:子元素可以繼承父元素的屬性…

邊緣函數:全棧開發的最后1毫秒性能革命

一、邊緣計算的時空折疊術 1. 傳統CDN vs. 智能邊緣網絡 全球電商平臺實測數據: 場景云端處理延遲邊緣處理延遲轉化率提升搜索建議320ms8ms18%個性化推薦450ms12ms27%實時庫存檢查680ms9ms42%欺詐檢測920ms15ms63% 二、邊緣全棧架構的量子糾纏 1. 代碼的時空分布…