Java并發編程的藝術(十)——Java中的鎖(5)

1. LockSupport工具

1.1 LockSupport的作用

當需要阻塞或喚醒一個線程的時候,都會使用LockSupport工具類來完成相應工作。LockSupport定義了一組公共的靜態方法,這些方法提供了做基本的線程阻塞和喚醒功能。

1.2 LockSupport提供的阻塞和喚醒方法

方法描述
void park()阻塞當前線程,如果調用unpark(Thread)方法或被中斷,才能從park()返回。
void parkNanos(long nanos)阻塞當前線程的超時返回版本,阻塞時間最長不超過nanos納秒。
void parkUntil(long deadline)阻塞當前線程,直到deadline時間(從1970年開始到deadline時間的毫秒數)。
void unpark(Thread)喚醒處于阻塞狀態的線程.

1.3 LockSupport新增的方法

在Java 6中,LockSupport增加了park(Object blocker)、parkNanos(Object blocker, long nanos)、parkUntil(Object blocker, long deadline)這3個方法,用于實現阻塞當前線程的功能,其中參數blocker是用來標識當前線程在等待的對象,該對象主要用于問題排查和系統監控。

2. Condition接口

2.1 Condition接口的理解

Java對象的wait()、notify()等方法和synchronized關鍵字配合,可以實現等待/通知模式。此外還有一種方式可以實現等待/通知模式:Condition接口與Lock接口配合。

2.2 Condition接口示例

public class ConditionUseCase {Lock lock = new ReentrantLock();Condition condition = lock.newCondition();public void conditionWait() throws InterruptedException {lock.lock();try {condition.await();} finally {lock.unlock();}}public void conditionSingnal() throws InterruptedException {lock.lock();try {condition.signal();} finally {lock.unlock();}}
}
復制代碼
  • 1.Condition定義了等待/通知模式的相關方法,并且Condition實例是由鎖創建出來的,在調用Condition的這些方法前需先獲得和Condition對象相關聯的鎖。
  • 2.調用await()方法后,當前線程釋放鎖并進入等待狀態,當其他對象調用Condition的signal()方法后當前線程才能從await()方法中返回,且返回前已經獲得了鎖。

2.3 Condition的方法

方法描述
void await() throws InterruptedException當前線程進入等待狀態,直到被通知(signal)或者被中斷。
void awaitUninterruptibly()當前線程進入等待狀態直到被通知,對中斷不做響應。
long awaitNanos(long nanosTimeout) throws InterruptedExceptionvoid await() throws InterruptedException方法的超時等待版本,返回值表示當前剩余的時間,如果在nanosTimeout之前被喚醒,返回值 = nanosTimeout - 實際消耗的時間,返回值 <= 0表示超時。
boolean awaitUntil(Date deadline) throws InterruptedException當前線程進入等待狀態直到被通知、中斷、到達某個時間點。在deadline時間點前線程能被通知或中斷則返回true,否則返回false。
void signal()喚醒一個等待在Condition上的線程。
void signalAll()喚醒所有等待在Condition上的線程。

轉載于:https://juejin.im/post/5d020a41f265da1ba25259af

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

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

相關文章

運動-模擬返回頂部

第一步&#xff1a;獲取底部的那個按鈕對象&#xff0c;默認的情況下那個按鈕對象是不可見的。可見的條件的是滾輪距離頂部有距離。 var oBtndocument.getElementById(btn1); 第二步&#xff1a;添加滾輪事件。 (1). 獲取滾輪距離頂部的距離。如果距離大于0&#xff0c;就將按鈕…

《JavaScript高級程序設計》筆記總結

在北京上班的我每天在上下班路上的時間總共是兩個半小時&#xff0c;為了充實這兩個多小時的時間&#xff0c;我便花了銀子換得了下面這個寶貝 本書內容&#xff08;引用書中前言&#xff09; 本書提供了JavaScript開發人員必須掌握的內容&#xff0c;全面涵蓋了JavaScript的…

Task執行多次

項目中&#xff0c;曾經出現過啟動時數據庫連接數瞬間增大&#xff0c;當時并沒有注意該問題。 后期&#xff0c;由于Task任務多次執行&#xff0c;才著手查看這個問題&#xff0c;經排查&#xff0c;由于tomcat中webapp配置多次&#xff0c;導致webapp被掃描多次&#xff08;配…

ES6 的新特性總結

ES6 的新特性總結 關于聲明變量 由 var 變成 let 和 const 區別&#xff1a; var聲明的變量會掛載到window上&#xff0c;let和const聲明的變量不會var聲明的變量存在變量提升&#xff0c;而let和const聲明的變量不存在變量提升let和const聲明的變量形成塊級作用域在同一作…

遞推(一):遞推法的基本思想

所謂遞推&#xff0c;是指從已知的初始條件出發&#xff0c;依據某種遞推關系&#xff0c;逐次推出所要求的各中間結果及最后結果。其中初始條件或是問題本身已經給定&#xff0c;或是通過對問題的分析與化簡后確定。 利用遞推算法求問題規模為n的解的基本思想是&#xff1a;當…

在vue中methods互相調用的方法

在vue中methods互相調用的方法 轉載于:https://www.cnblogs.com/macT/p/10212878.html

MUI H5+ 開發app基礎

加載子頁面(防止手機性能差,出現上下滑動卡頓) 其中 url 就是子頁面的路徑 id 為自定義 通常和頁面名稱一致頁面的跳轉和傳值 切記 如果使用mui組件內的底部導航跳轉的方式只能使用document獲取元素的id 頁面跳轉傳值 新頁面接收參數 頁面初始化 H5加載完畢 判斷某個元素中是…

對象

一、對象 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><script type"text/javascript">/** JS中數據類型* String 字符串* Number 數值* Boolean 布爾值* Null 空值* Undefine…

uni-app 組件傳值

uni-app中的組件之間的傳值 我們將compontents中的test文件作為子組件 引入到index中使用 引入并使用 效果如下 父傳子 首先我們在父組件中使用子組件的標簽中去自定義title 在子組件中 通過props去接收并處理 效果如下&#xff1a; 子傳父 子組件中 設置一個按鈕…

JSP XML數據處理

JSP XML數據處理 當通過HTTP發送XML數據時&#xff0c;就有必要使用JSP來處理傳入和流出的XML文檔了&#xff0c;比如RSS文檔。作為一個XML文檔&#xff0c;它僅僅只是一堆文本而已&#xff0c;使用JSP創建XML文檔并不比創建一個HTML文檔難。 使用JSP發送XML 使用JSP發送XML內容…

Docker 圖形界面管理工具 -- Portainer

Portainer&#xff08;基于 Go&#xff09;是一個輕量級的管理界面&#xff0c;可讓您輕松管理Docker主機或Swarm集群。 Portainer的使用意圖是簡單部署。它包含可以在任何 Docker 引擎上運行的單個容器&#xff08;Docker for Linux 和 Docker for Windows&#xff09;。 Port…

vue cli3.0創項目報錯‘This may cause things to work incorrectly. Make sure to use the same version for b’

錯誤&#xff1a; throw new Error(^Error:Vue packages version mismatch:- vue2.6.12 (C:\Users\Administrator\AppData\Roaming\npm\node_modules\vue\dist\vue.runtime.common.js) - vue-template-compiler2.6.11 (C:\Users\Administrator\AppData\Roaming\npm\node_module…

Web程序中使用EasyUI時亂碼問題

今天偶然遇見使用easyUI時&#xff0c;彈窗和分頁都是亂碼的問題&#xff0c;耗費了很長的時間來解決&#xff0c;以此記住這個坑。 相信大家都會在使用easyUI時都會設置這樣一句&#xff1a; 那么就有可能出現設置中文后的亂碼問題&#xff0c;如下圖&#xff1a; 因為在使用e…

關于window對象

window對象 - navigator&#xff08;導航器對象&#xff09; appCodeName&#xff1a;返回瀏覽器的代碼名appName&#xff1a;返回瀏覽器的名稱appVersion&#xff1a;返回瀏覽器的平臺和版本信息cookieEnabled&#xff1a;返回指明瀏覽器中是否禁用cookie的布爾值platform&a…

160-PHP 文本替換函數str_replace(一)

<?php$strHello world!; //定義源字符串$searcho; //定義將被替換的字符$replaceO; //定義替換的字符串$resstr_replace($search,$replace,$str); //使用函數處理字符串echo "{$str}替換后的效果為&#xff1a;<br />{$res}";…

流的操作規律

IO流中對象很多&#xff0c;解決問題(處理設備上的數據時)到底該用哪個對象呢&#xff1f;   把IO流進行了規律的總結(四個明確)&#xff1a; 明確一&#xff1a;要操作的數據是數據源還是數據目的。 源&#xff1a;InputStream Reader 目的&#xff1a;OutputStream Writ…

看完就懂的編輯頁面如何巧妙處理時間

需求分析 分析&#xff1a; 我們通常會遇到這種情況&#xff0c;當我們制作一個表單頁面的時候&#xff0c;通常會有添加和編輯的情況&#xff0c;我們在提交的時候還需要將時間的格式轉換為字符串格式進行傳參。 在這里我們使用的是 iview 中的 DatePicker type格式為datetime…

[轉]Tomcat中8005/8009/8080/8443端口的作用

8005&#xff1a;關閉tomcat進程所用。當執行shutdown.sh關閉tomcat時就是連接8005端口執行“SHUTDOWN”命令--由此&#xff0c;我們直接telnet8005端口執行“SHUTDOWN”&#xff08;要大寫&#xff0c;小寫沒用&#xff1b;不運只能telnet 127.0.0.1 8005其他地址telnet都不能…

月入10萬和月入5千的人關鍵區別是什么???

月入10萬和月入5千的人關鍵區別是什么&#xff1f;&#xff1f;&#xff1f;知識體系、決策能力、魄力和格局&#xff01;&#xff01;&#xff01;人不學不知道&#xff0c;看過很多書&#xff0c;學過很多課&#xff0c;發現不久就忘了&#xff0c;很難真正被自己消化吸收&am…

關于“wap2app僅支持對已通過ICP備案的域名站點進行打包”問題解決

關于“wap2app僅支持對已通過ICP備案的域名站點進行打包”問題解決 如果我們是通過Vue技術寫的移動端&#xff0c;開發完成后我們的項目需要放到服務器上&#xff0c;然后我們在將服務器上面的項目打包apk格式 wap2app將網頁打包成apk步驟 使用HbuilderX創建一下wap2app項目 我…