Object.wait()和LockSupport.park()

Object.wait()LockSupport.park() 都是用來使當前線程等待的方法,但它們在使用場景和機制上有所不同:

Object.wait()

  1. 用途wait() 方法屬于對象監視器(Monitor)的一部分,通常與 synchronized 塊或方法一起使用。當線程調用某個對象的 wait() 方法時,它會釋放該對象的鎖,并使自己進入等待狀態,直到其他線程調用該對象的 notify()notifyAll() 方法喚醒它,此時線程會重新嘗試獲取鎖并繼續執行。

  2. 位置限制:只能在同步代碼塊或同步方法中調用,因為需要先獲取到對象的監視器鎖。

  3. 喚醒條件:可以被 notify() 喚醒,意味著有一個或多個等待線程會被喚醒,但具體哪個線程被喚醒是不確定的;也可以被 notifyAll() 喚醒,這時所有等待該對象監視器的線程都會進入鎖的競爭狀態。

LockSupport.park()

  1. 用途park() 方法屬于 java.util.concurrent.locks.LockSupport 類,它提供了一種低級別的線程阻塞原語。它不需要與特定的鎖關聯,可以在任何地方調用,使得線程阻塞。它通常與 unpark() 方法配對使用,后者可以喚醒一個調用了 park() 的線程。

  2. 位置限制:沒有位置限制,可以在任何地方調用,不需要先獲取鎖。

  3. 喚醒條件:調用 LockSupport.unpark(Thread thread) 方法可以直接喚醒目標線程,更加靈活和精確。它可以喚醒一個特定的線程,而無需競爭或不確定性。

  4. 線程許可park()unpark() 是基于每個線程的許可(permit)機制。初始時,每個線程沒有許可,調用 unpark() 會給指定線程添加一個許可,即使之前已經調用過 unpark() 給該線程添加了許可,再調用也不會造成影響(許可不會累積)。調用 park() 時,如果沒有許可,線程會阻塞,如果有許可,則消耗許可并繼續執行。

總結來說,Object.wait() 更適合與同步代碼塊或方法一起使用,與對象的監視器鎖緊密相關,適用于傳統的線程協作場景;而 LockSupport.park() 提供了一種更底層、更靈活的線程阻塞和喚醒機制,適用于更復雜的并發控制邏輯。

下面是分別使用 Object.wait()LockSupport.park() 的簡單示例:

使用 Object.wait() 的例子

public class WaitNotifyExample {public static void main(String[] args) {final Object monitor = new Object();Thread waitingThread = new Thread(new Runnable() {@Overridepublic void run() {synchronized (monitor) {System.out.println(Thread.currentThread().getName() + " 開始等待");try {monitor.wait(); // 等待被喚醒} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " 被喚醒");}}}, "WaitingThread");Thread notifierThread = new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(2000); // 模擬一些工作} catch (InterruptedException e) {e.printStackTrace();}synchronized (monitor) {monitor.notify(); // 喚醒等待的線程System.out.println(Thread.currentThread().getName() + " 發出了喚醒通知");}}}, "NotifierThread");waitingThread.start();notifierThread.start();}
}

使用 LockSupport.park() 的例子

import java.util.concurrent.locks.LockSupport;public class ParkUnparkExample {public static void main(String[] args) {Thread waitingThread = new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " 開始等待");LockSupport.park(); // 阻塞當前線程System.out.println(Thread.currentThread().getName() + " 被喚醒");}}, "WaitingThread");Thread unparkerThread = new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(2000); // 模擬一些工作} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " 準備喚醒線程");LockSupport.unpark(waitingThread); // 喚醒指定線程}}, "UnparkerThread");waitingThread.start();unparkerThread.start();}
}

在這兩個例子中,第一個展示了如何使用 Object.wait()notify() 來實現線程間的等待與通知,第二個例子展示了如何使用 LockSupport.park()unpark() 實現類似的線程控制功能,但更為靈活和獨立于特定鎖。

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

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

相關文章

電感式傳感器

電感傳感器是基于電磁感應原理,將被測非電量(如位移、壓力、振動等)轉換為電感量變化的一種結構性傳感器。利用自感原理的有自感式傳感器(可變磁阻式),利用互感原理的有互感式(差動變壓器式和渦…

AI學習指南線性代數篇-矩陣的運算

AI學習指南線性代數篇-矩陣的運算 線性代數中,矩陣的運算是一項重要而基礎的內容。在人工智能領域,矩陣的運算被廣泛應用于各種算法中,如神經網絡、圖像處理、自然語言處理等。本文將從矩陣的運算概述、在AI中的使用場景、定義和意義以及公式…

QT:QML制作線形圖

目錄 一.介紹 二.引入庫 三.自定義屬性 四.懸停處理函數 五.設置X軸 六.設置Y軸 七.畫線 八.測試點坐標 九.設置值 十.效果演示 十一.代碼演示 1.LineGraph.qml 2.main.qml 一.介紹 線形圖(也稱為折線圖)是一種常用的數據可視化工具&#…

如何找到MySQL中存儲引擎所對應的表空間并且打開?

在上節課我們學習了數據庫(MySQL)進階:存儲引擎,有不少同學產生疑惑,到底要怎么找到表空間并且打開啊?這節課我們就來探討。 首先,根據這個路徑:C:\ProgramData\MySQL\MySQL Server…

mybatis-plus如何使用QueryWrapper和LambdaQueryWrapper的and方法?

構造器去構造條件的時候,我們都知道eq方法去鏈式的時候是自動添加and的,那如果需要and的那個條件需要加括號呢? 環境 Jdk 1.8、mybatis-plus 3.5.3.2、mysql 5.7.11 示例 sql: select * from user where openid 1 and (phon…

谷歌Flank潛藏3年的Github Action供應鏈攻擊

01 簡 介 Flank [1] 是谷歌 Firebase Test lab 開源在 Github 的一個項目,用于同時對多個安卓和IOS設備進行測試。2024年4月15號 AWS 安全工程師 Adnan Khan 公布了關于該項目代碼倉庫 Github Action CI/CD 存在漏洞的細節[2],漏洞在2020年于此 代碼合…

通信網絡時鐘同步(PTP網絡授時服務器)技術探討

通信網絡時鐘同步(NTP網絡授時服務器)技術探討 通信網絡時鐘同步(NTP網絡授時服務器)技術探討 1、著移動通信業務的發展和移動用戶的快速增長, 移動網絡架構向IP化、寬帶化進展。為了適應業務IP化發展趨勢&#xff0c…

02 VUE學習:模板語法

模板語法 Vue 使用一種基于 HTML 的模板語法,使我們能夠聲明式地將其組件實例的數據綁定到呈現的 DOM 上。所有的 Vue 模板都是語法層面合法的 HTML,可以被符合規范的瀏覽器和 HTML 解析器解析。 在底層機制中,Vue 會將模板編譯成高度優化的…

開發vue3,真的可以不用ref/reactive了,也不需要ref.value

什么是Cabloy-Front? Cabloy-Front 是一款支持 IOC 容器的 Vue3 框架。不用ref/reactive,不用ref.value,不用pinia 與UI庫的配合 Cabloy-Front 可以搭配任何 UI 庫使用,并且內置了幾款 UI 庫的項目模版,便于開箱即用…

免費SSL證書簽發安裝指南

一、簽發 1.選擇證書頒發機構(CA):首先,你需要找到一個提供免費SSL證書的CA。有些CA會提供永久免費的SSL證書,而有些則可能只提供有限時間的試用證書,如JoySSL就提供永久免費證書。 2.生成CSR&#xff08…

WPF 鼠標拖拽平移

效果 xaml <ScrollViewer x:Name"scrollViewer" HorizontalScrollBarVisibility"Hidden" VerticalScrollBarVisibility"Disabled" Background"#FFF1ADAD"PreviewMouseDown"ScrollViewer_OnPreviewMouseDown"PreviewMou…

Electron學習筆記(一)

文章目錄 相關筆記筆記說明 一、輕松入門 1、搭建開發環境2、創建窗口界面3、調試主進程 二、主進程和渲染進程1、進程互訪2、渲染進程訪問主進程類型3、渲染進程訪問主進程自定義內容4、渲染進程向主進程發送消息5、主進程向渲染進程發送消息6、多個窗口的渲染進程接收主進程發…

白鯨開源CEO郭煒在2024 DataOps發展大會上獲聘專家

2024年5月15日&#xff0c;白鯨開源CEO郭煒在2024 DataOps發展大會上被正式聘任為DataOps專家&#xff0c;并獲得了榮譽證書。本次大會由中國通信標準化協會主辦&#xff0c;中關村科學城管委會提供支持&#xff0c;大數據技術標準推進委員會&#xff08;CCSATC601&#xff09;…

iisnginx環境一次奇怪的跨域問題解決經過

跨域問題描述&#xff1a; iis網站跨域、nginx 網站跨域 都已配置&#xff0c;訪問接口依然出現跨域問題。 錯誤提示&#xff1a; ccess to XMLHttpRequest at ‘https://xxx.com/gameapi/preserve/get/status’ from origin ‘https://cdn.xxx.com’ has been blocked by CO…

Python簡易信息管理系統

我們將通過一個實例來探討如何使用Python與MySQL數據庫進行交互&#xff0c;以構建一個簡單的學生信息管理系統。這個系統將能夠執行基本的CRUD&#xff08;創建(Create)、讀取(Retrieve)、更新(Update)、刪除(Delete)&#xff09;操作&#xff0c;以管理學生信息。我們將使用m…

Python爬蟲-批量爬取新能源汽車上牌量

前言 本文是該專欄的第27篇,后面會持續分享python爬蟲干貨知識,記得關注。 最近粉絲朋友咨詢新能源汽車上牌量數據的爬取方法,對此在本文中,筆者以某汽車平臺為例,通過python來實現對“新能源汽車上牌量”的數據進行抓取。 具體實現思路和詳細邏輯,筆者將在正文結合完整…

三豐云搭建QQ-bot的服務器-代碼實現(3)

網址&#xff1a;https://www.sanfengyun.com >> 三豐云免費云服務器 代碼實現 書接上回裝飾器&#xff0c;顯而易見&#xff0c;只有裝飾器還不完善&#xff0c;所以我們接著來補充代碼 首先定義一個 MyClient 類 class MyClient(botpy.Client):async def on_ready(…

Nacos :安裝配置、服務注冊

目錄 一、中文官網 二、配置 1、application.properties 2、啟動 Nacos 服務 3、訪問 Nacos 三、服務注冊 1、配置Nacos客戶端的pom依賴 2、添加服務配置信息 3、添加 Nacos 啟動注解 一、中文官網 Nacos官網 | Nacos 官方社區 | Nacos 下載 | Nacos 下載后直接解壓…

0X JavaSE-- ( 遍歷-- for each、Iterator 、)、

for each for each 語句是 JDK5 的新特征&#xff0c;主要用于遍歷數組、集合。 // collection 可以是數組/實現了 Iterable 接口的集合類 for(dataType variable : collection){ // 使用 item 進行操作 } // 遍歷二維數組// 初始化一個二維數組int[][] array {{1, 2, 3},{4…

GO語言核心30講 實戰與應用 (io包,bufio包,os包,網絡服務,http,性能分析)

原站地址&#xff1a;Go語言核心36講_Golang_Go語言-極客時間 一、io包中的接口和工具 1. strings.Builder、strings.Reader 和 bytes.Buffer 這些類型實現了 io 包的很多接口&#xff0c;目的是什么&#xff1f; 是為了提高不同程序實體之間的互操作性。 程序實體是指比如網…