Java并發編程:sleep()與wait()核心區別詳解

今天完成了實驗室納新網站的工作,大體功能都已經完善,也和前端測試過了,費了點時間,而且今天大部分時間在看langchain4j的東西,就簡單復習一下八股,等會再復習一下算法題吧

在Java并發編程中,sleep()wait()都用于暫停線程執行,但它們在設計目的、行為和使用場景上有本質區別。以下是詳細對比及示例說明:

核心區別總結

特性sleep()wait()
所屬類Thread類的靜態方法Object類的實例方法
鎖釋放? 不釋放任何鎖? 釋放對象鎖(只釋放調用它的對象的鎖)
喚醒條件超時結束或被中斷(InterruptedException需其他線程調用notify()/notifyAll()或超時
同步要求無需在同步塊中調用必須在synchronized塊或方法中使用
用途單純暫停當前線程線程間通信(協調多個線程的執行順序)

示例代碼解析

示例1:sleep()不釋放鎖(獨占鎖場景)
public class SleepDemo {public static void main(String[] args) {Object lock = new Object();new Thread(() -> {synchronized (lock) {System.out.println("Thread-1: 獲得鎖,開始sleep(2000)");try {Thread.sleep(2000); // 暫停2秒,但不會釋放lock鎖} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Thread-1: sleep結束,釋放鎖");}}).start();new Thread(() -> {synchronized (lock) {System.out.println("Thread-2: 獲得鎖"); // 需等待Thread-1釋放鎖}}).start();}
}

輸出結果:

Thread-1: 獲得鎖,開始sleep(2000)
(等待2秒...)
Thread-1: sleep結束,釋放鎖
Thread-2: 獲得鎖

結論sleep()期間不釋放鎖,其他線程無法進入同步塊。

示例2:wait()釋放鎖(線程協作場景)
public class WaitDemo {public static void main(String[] args) throws InterruptedException {Object lock = new Object();// 等待線程new Thread(() -> {synchronized (lock) {System.out.println("Thread-1: 獲得鎖,調用wait()釋放鎖");try {lock.wait(); // 釋放lock鎖,進入等待狀態} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Thread-1: 被喚醒,重新獲得鎖");}}).start();Thread.sleep(500); // 確保Thread-1先執行// 喚醒線程new Thread(() -> {synchronized (lock) {System.out.println("Thread-2: 獲得鎖,執行notify()");lock.notify(); // 喚醒Thread-1(但需退出同步塊才釋放鎖)System.out.println("Thread-2: notify()后,仍持有鎖2秒");try {Thread.sleep(2000); // sleep()不釋放鎖} catch (InterruptedException e) {e.printStackTrace();}}}).start();}
}

輸出結果:

Thread-1: 獲得鎖,調用wait()釋放鎖
Thread-2: 獲得鎖,執行notify()
Thread-2: notify()后,仍持有鎖2秒
(等待2秒...)
Thread-1: 被喚醒,重新獲得鎖

結論

  1. wait()立即釋放鎖Thread-2得以進入同步塊。
  2. Thread-2調用notify()后,Thread-1需等待Thread-2退出同步塊(釋放鎖)才能重新獲得鎖并繼續執行。

關鍵點詳解

  1. 鎖釋放機制

    • sleep():線程暫停但保留所有鎖,可能導致其他線程阻塞。
    • wait():釋放調用對象的鎖,允許其他線程獲得鎖并執行。
  2. 喚醒方式

    • sleep():超時結束或調用線程的interrupt()方法。
    • wait():需其他線程顯式調用notify()/notifyAll(),或超時(若設置了超時時間)。
  3. 使用約束

    • wait()/notify()必須synchronized代碼塊中調用,否則拋出IllegalMonitorStateException
    • sleep()可在任何上下文調用(但需處理InterruptedException)。
  4. 設計目的

    • sleep():用于定時任務(如輪詢間隔)、模擬耗時操作。
    • wait():用于線程協作(如生產者-消費者模型),避免忙等待(busy-waiting)。

經典應用場景

  • sleep():定時任務調度(如每5秒檢查一次狀態)、模擬網絡延遲。
  • wait()/notify():線程間協調(如生產者生產后通知消費者)、條件等待(等待資源就緒)。

重要提示:Java 5+推薦使用java.util.concurrent包的ConditionCountDownLatch等高級工具替代wait()/notify(),以簡化并發控制。

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

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

相關文章

AR眼鏡在智能制造的應用方向和場景用例|阿法龍XR云平臺

AR巡檢在制造業的應用已形成覆蓋設備維護、質量檢測、安全監控和遠程協作四大類別的成熟場景,不同制造領域的實踐各具特色,為行業提供了寶貴參考。在汽車制造領域,AR 巡檢主要應用于生產線設備維護和焊接質量檢測。在汽車廠總裝車間部署 AR 系…

【Linux系統】線程同步

在上一章節中,我們使用互斥量之后,確實解決了數據競爭問題,但出現了新的問題:只有一個線程(thread 1)在處理所有售票任務。這展示了互斥量的一個局限性:它確保了線程安全,但不保證公…

代碼隨想錄訓練營第三十一天|LeetCode56.合并區間、LeetCode738.單調遞增的數字

56.合并區間 思路:先讓二維數組進行排序; 遍歷數組,定義一個min表示重合區間的左邊界,max表示重合區間的右邊界; 如果當前區間左邊大于max,就證明重合區間斷了,就要對它進行加入ArrayList&am…

【Unity項目經驗分享】實現左右分屏裸眼3D程序

1、實現原理左右分屏原理,左右屏內容左右方向存在些許偏差。通過左右相機,然后左側相機向左側偏移一點3cm,右側相機向右側屏偏移一定3cm,然后將左右相機渲染內容通過RenderTexture渲染到Canvas上面的左右RawImage上面。2、實現具體…

設計軟件啟動失敗?“找不到vcruntime140.dll,無法繼續執行代碼” 場景化解決方案來了

打游戲時,剛加載到登錄界面就因 “找不到 vcruntime140.dll, 無法繼續執行代碼” 閃退;寫代碼時,編譯工具突然報錯中斷工作;做設計時,PS、AE 啟動失敗彈出相同提示 —— 不同場景下的 vcruntime140.dll 錯誤&#xff0…

基于Echarts+HTML5可視化數據大屏展示-茶葉種植大數據溯源平臺

效果展示&#xff1a;代碼結構&#xff1a;主要代碼實現 index.html布局 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta n…

PLOS One圖片處理要求及處理辦法

PLOS One圖片處理&#xff1a; 要求&#xff1a;Please remove your figures from within your manuscript file, leaving only the individual TIFF/EPS image files. These will be automatically included in the reviewer’s PDF. 請從稿件文件中移除所有圖表&#xff0c;…

AutoLayout與Masonry:簡化iOS布局

Auto Layout 與 Masonry蘋果提供的自動布局&#xff08;Auto Layout&#xff09;能夠對視圖進行靈活有效的布局。但是&#xff0c;使用原生的自動布局相關的語法創建約束的過程是非常冗長的&#xff0c;可讀性也比較差。Masonry 的目標其實就是 為了解決原生自動布局語法冗長的…

從設計到落地:校園圖書館系統的面向對象實現全流程

很多小白學面向對象時總困惑&#xff1a;“類圖、用例圖我會畫&#xff0c;但怎么把這些設計變成能跑的代碼&#xff1f;” 這篇文章就用 “校園圖書館管理系統” 當例子&#xff0c;從需求分析→設計方案→代碼實現→測試驗證&#xff0c;帶你走通 “設計→實現” 的完整鏈路&…

[鴻蒙心跡]帶新人學鴻蒙的悲歡離合

2023年底&#xff0c;我和陸神&#xff0c;威哥&#xff0c;老羅一起去深圳參加了鴻蒙師資培訓正式開啟了鴻蒙之旅&#xff0c;當時和陸神拍的合照但是我把陸神打碼了 學完以后就考取了鴻蒙的高級認證 看到沒有時間是2023年11月 馬上都要到期了。 想一想時間過得真快&#xff…

MindShow AI:AI思維導圖生成工具高效解決思路混亂難題,快速搭建學習與工作大綱

你有沒有過這種時候&#xff1f;想整理一份學習大綱或者項目方案&#xff0c;腦子裡一堆想法卻散得像亂麻 —— 比如要做個 “數據分析入門規劃”&#xff0c;明明知道要學 Excel、SQL、Python&#xff0c;可怎么分階段、每個階段學哪些重點&#xff0c;對著空白文檔半天列不出…

快速搭建一個Vue+TS+Vite項目

1、在一個文件夾下通過cmd打開&#xff0c;輸入命令npm create vitelatest命名要為英文2.選擇項目框架通過上下鍵位選擇Vue框架&#xff1a;選好按回車鍵3.選擇開發語言選擇TypeScript語言&#xff0c;方便后續開發&#xff1a;創建好的項目目錄為&#xff1a;4.安裝Vite依賴接…

深度學習:ResNet 殘差神經網絡詳解

一、ResNet 殘差神經網絡的起源與核心地位ResNet&#xff08;Residual Neural Network&#xff0c;殘差神經網絡&#xff09;是 2015 年由微軟亞洲研究院的何凱明、張祥雨等研究者提出的深度神經網絡架構。在當年的 ImageNet 大規模視覺識別挑戰賽&#xff08;ILSVRC&#xff0…

Python面試題及詳細答案150道(116-125) -- 性能優化與調試篇

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面試題-專欄總目錄 文章目錄 一、本文面試題目錄 116. 如何查找Python程序的…

C++11 智能指針的使?及其原理

目錄 1. 智能指針的使?場景分析 2. RAII和智能指針的設計思路 3. C標準庫智能指針的使? 4. 智能指針的原理 5. shared_ptr和weak_ptr 5.1 shared_ptr循環引?問題 5.2 weak_ptr 6. shared_ptr的線程安全問題 7. C11和boost中智能指針的關系 8. 內存泄漏 8.1 什么是…

【Linux】Linux進程狀態和僵尸進程:一篇看懂“進程在忙啥”

前言&#xff1a;歡迎各位光臨本博客&#xff0c;這里小編帶你直接手撕Make/Makefile (自動化構建)&#xff0c;文章并不復雜&#xff0c;愿諸君耐其心性&#xff0c;忘卻雜塵&#xff0c;道有所長&#xff01;&#xff01;&#xff01;&#xff01; **&#x1f525;個人主頁&a…

開源視頻剪輯工具推薦

開源視頻剪輯和處理工具近年來發展非常迅速&#xff0c;許多工具的功能已經足以媲美甚至超越一些商業軟件。以下是一些頂級的開源視頻編輯和處理工具&#xff0c;涵蓋了從簡單易用到專業級別的不同需求。 一、 主要視頻編輯軟件&#xff08;非線性編輯&#xff0c;NLE&#xf…

第十四屆藍橋杯青少組C++國賽[2023.5.28]第二部分編程題(4、 數獨填數)

參考程序&#xff1a;#include <bits/stdc.h> using namespace std;char board[9][9];// 檢查在 (r,c) 填 num 是否有效 bool isValid(int r, int c, char num) {for (int i 0; i < 9; i) {if (board[r][i] num) return false; // 同行if (board[i][c] num) r…

C語言中奇技淫巧08-使用alloca/__builtin_alloca從棧上分配空間

alloca是什么? alloca 是一個非標準但廣泛支持的 C 語言函數&#xff0c;用于在當前函數的棧&#xff08;stack&#xff09;上動態分配內存。 與 malloc 的區別&#xff1a; malloc 在堆&#xff08;heap&#xff09; 上分配內存&#xff0c;需要手動調用 free 釋放。alloca 在…

【Markdown轉Word完整教程】從原理到實現

Markdown轉Word完整教程&#xff1a;從原理到實現 前言 在技術文檔編寫和學術論文創作中&#xff0c;Markdown因其簡潔的語法和良好的可讀性而廣受歡迎。然而&#xff0c;在實際工作中&#xff0c;我們經常需要將Markdown文檔轉換為Word格式&#xff0c;以便與同事協作、提交正…