測試并發應用 (一)監控Lock接口

聲明:本文是《 Java 7 Concurrency Cookbook 》的第八章, 作者: Javier Fernández González 譯者:鄭玉婷 ?

校對:方騰飛

監控Lock接口

Lock 接口是Java 并發 API提供的最基本的機制來同步代碼塊。它允許定義臨界區。臨界區是代碼塊可以共享資源,但是不能被多個線程同時執行。此機制是通過Lock 接口和 ReentrantLock 類實現的。

在這個指南,你將學習從Lock對象可以獲取的信息和如何獲取這些信息。

準備

指南中的例子是使用Eclipse IDE 來實現的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 打開并創建一個新的java項目。

怎么做呢…

按照這些步驟來實現下面的例子:


001 package tool;
002?
003 import java.util.Collection;
004 import java.util.concurrent.TimeUnit;
005 import java.util.concurrent.locks.Lock;
006 import java.util.concurrent.locks.ReentrantLock;
007?
008//1.?? 創建一個類,名為 MyLock ,擴展 ReentrantLock 類。
009 public class MyLock extends ReentrantLock {
010?
011 ????// 2. 實現 getOwnerName() 方法。此方法使用Lock類的保護方法 getOwner(), 返回控制鎖的線程(如果存在)的名字。
012 ????public String getOwnerName() {
013 ????????if (this.getOwner() == null) {
014 ????????????return "None";
015 ????????}
016 ????????return this.getOwner().getName();
017 ????}
018?
019 ????// 3. 實現 getThreads() 方法。此方法使用Lock類的保護方法 getQueuedThreads(),返回在鎖里的線程的 queued
020 ????// list。
021 ????public Collection<Thread> getThreads() {
022 ????????return this.getQueuedThreads();
023 ????}
024?
025 ????// 4. 創建一個類,名為 Task,實現 Runnable 接口.
026 ????public class Task implements Runnable {
027?
028 ????????// 5. 聲明一個私有 Lock 屬性,名為 lock。
029 ????????private Lock lock;
030?
031 ????????// 6. 實現類的構造函數,初始化它的屬性值。
032 ????????public Task(Lock lock) {
033 ????????????this.lock = lock;
034 ????????}
035?
036 ????????// 7. 實現 run() 方法。創建迭代5次的for循環。
037 ????????@Override
038 ????????public void run() {
039 ????????????for (int i = 0; i < 5; i++) {
040?
041 ????????????????// 8. 使用lock()方法獲取鎖,并打印一條信息。
042 ????????????????lock.lock();
043 ????????????????System.out.printf("%s: Get the Lock.\n", Thread.currentThread()
044 ????????????????????????.getName());
045?
046 ????????????????// 9. 讓線程休眠 500 毫秒。使用 unlock() 釋放鎖并打印一條信息。
047 ????????????????try {
048 ????????????????????TimeUnit.MILLISECONDS.sleep(500);
049 ????????????????????System.out.printf("%s: Free the Lock.\n", Thread
050 ????????????????????????????.currentThread().getName());
051 ????????????????} catch (InterruptedException e) {
052 ????????????????????e.printStackTrace();
053 ????????????????} finally {
054 ????????????????????lock.unlock();
055 ????????????????}
056 ????????????}
057 ????????}
058 ????}
059?
060 ????// 10. 創建例子的主類通過創建一個類,名為 Main 并添加 main()方法。
061 ????public static void main(String[] args) throws Exception {
062?
063 ????????// 11. 創建 MyLock 對象,名為 lock。
064 ????????MyLock lock = new MyLock();
065?
066 ????????// 12. 創建有5個Thread對象的 array。
067 ????????Thread threads[] = new Thread[5];
068?
069 ????????// 13. 創建并開始5個線程來執行5個Task對象。
070 ????????for (int i = 0; i < 5; i++) {
071 ????????????Task task = lock.new Task(lock);
072 ????????????threads[i] = new Thread(task);
073 ????????????threads[i].start();
074 ????????}
075?
076 ????????// 14. 創建迭代15次的for循環。
077 ????????for (int i = 0; i < 15; i++) {
078?
079 ????????????// 15. 把鎖的擁有者的名字寫入操控臺。
080 ????????????System.out.printf("Main: Logging the Lock\n");
081 ????????????System.out.printf("************************\n");
082 ????????????System.out.printf("Lock: Owner : %s\n", lock.getOwnerName());
083?
084 ????????????// 16. 顯示鎖queued的線程的號碼和名字。
085 ????????????System.out.printf("Lock: Queued Threads: %s\n",
086 ????????????????????lock.hasQueuedThreads()); // 譯者注:加上 System
087 ????????????if (lock.hasQueuedThreads()) {
088 ????????????????System.out.printf("Lock: Queue Length: %d\n",
089 ????????????????????????lock.getQueueLength());
090 ????????????????System.out.printf("Lock: Queued Threads: ");
091 ????????????????Collection<Thread> lockedThreads = lock.getThreads();
092 ????????????????for (Thread lockedThread : lockedThreads) {
093 ????????????????????System.out.printf("%s ", lockedThread.getName());
094 ????????????????}
095 ????????????????System.out.printf("\n");
096 ????????????}
097?
098 ????????????// 17. 顯示關于Lock對象的公平性和狀態的信息。
099 ????????????System.out.printf("Lock: Fairness: %s\n", lock.isFair());
100 ????????????System.out.printf("Lock: Locked: %s\n", lock.isLocked());
101 ????????????System.out.printf("************************\n");
102?
103 ????????????// 18. 讓線程休眠1秒,并合上類的循環。
104 ????????????TimeUnit.SECONDS.sleep(1);
105 ????????}
106 ????}
107}

它是如何工作的…

在這個指南里,你實現的MyLock類擴展了ReentrantLock類來返回信息,除此之外獲得不到這些信息 ,因為ReentrantLock 類里的數據都是保護類型的。 通過MyLock類實現的方法:

  • getOwnerName():只有唯一一個線程可以執行被Lock對象保護的臨界區。鎖存儲了正在執行臨界區的線程。此線程會被ReentrantLock類的保護方法 getOwner()返回。 此方法使用 getOwner() 方法來返回線程的名字。
  • getThreads():當線程正在執行臨界區時,其他線程嘗試進入臨界區就會被放到休眠狀態一直到他們可以繼續執行為止。ReentrantLock類保護方法getQueuedThreads() 返回 正在等待執行臨界區的線程list。此方法返回 getQueuedThreads() 方法返回的結果。

我們還使用了 ReentrantLock 類里實現的其他方法:

  • hasQueuedThreads():此方法返回 Boolean 值表明是否有線程在等待獲取此鎖
  • getQueueLength(): 此方法返回等待獲取此鎖的線程數量
  • isLocked(): 此方法返回 Boolean 值表明此鎖是否為某個線程所擁有
  • isFair(): 此方法返回 Boolean 值表明鎖的 fair 模式是否被激活

更多…

ReentrantLock 類還有其他方法也是用來獲取Lock對象的信息的:

  • getHoldCount(): 返回當前線程獲取鎖的次數
  • isHeldByCurrentThread(): 返回 Boolean 值,表明鎖是否為當前線程所擁有

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

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

相關文章

[There will be more story......]

This blog will keep on updating.轉載于:https://www.cnblogs.com/SinGuLaRiTy2001/p/7965776.html

根據生日得到星座

--得到星座 function DataCenter_Setting:GetConstellation(month, day)local dataInfo {121, 220, 321, 421, 522, 622, 723, 824, 924, 1024, 1123, 1222}local Constellations {"水瓶", "雙魚", "白羊", "金牛", "雙子"…

[轉]Android 項目的代碼混淆,Android proguard 使用說明

簡介 Java代碼是非常容易反編譯的。為了很好的保護Java源代碼&#xff0c;我們往往會對編譯好的class文件進行混淆處理。 ProGuard是一個混淆代碼的開源項目。它的主要作用就是混淆&#xff0c;當然它還能對字節碼進行縮減體積、優化等&#xff0c;但那些對于我們來說都算是次要…

數據結構與算法:終于可以用三種語言(C,C#,JavaScript)把圖的廣度優先遍歷講清楚了(推薦收藏)

文章目錄鄰接矩陣存儲圖的廣度優先遍歷過程分析C語言實現隊列編程程序中加入圖的處理函數結果的再次分析C#語言實現圖的廣度優先遍歷、并顯示廣度優先遍歷生成樹JavaScript語言實現圖的廣度優先遍歷、并顯示廣度優先遍歷生成樹鄰接矩陣存儲圖的廣度優先遍歷過程分析 對圖1這樣…

C語言試題161之求100000以內的自守數

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:自守數是…

改造.NET遺留應用

淺議.NET遺留應用改造TLDR&#xff1a;本文介紹了遺留應用改造中的一些常見問題&#xff0c;并對改造所能開展的目標、原則、策略進行了概述。一、背景概述1、概述或許僅“遺留應用”這個標題就比較吸睛&#xff0c;因為我聽過太多人吐槽了。Robert Martin在《修改代碼的藝術》…

GitHub的DGit改進了平臺的可靠性、性能以及可用性

GitHub最近悄悄地發布了DGit&#xff0c;全稱為“分布式Git”。這是一種基于Git創建的分布式存儲系統&#xff0c;其目標是改進使用GitHub時的可靠性、可用性以及性能。\\DGit是一個應用層面的協議&#xff0c;它利用了Git分布式的特性&#xff0c;將每個倉庫在三臺不同的、獨立…

用靜態NAT實現外網PC訪問內網服務器

在我們的生產環境中常常處于安全考慮將服務器置于內網環境中&#xff0c;但同時得向外網提供各種服務功能&#xff0c;此時就需要用到NAT技術。下面是我用思科的仿真軟件搭建的一個實驗環境&#xff0c;實現外網PC訪問內網服務器。先說明一下實驗環境&#xff1a;路由器R0左邊為…

[轉]分布式事務之TCC服務設計和實現注意事項

1、TCC簡介 TCC是一種比較成熟的分布式事務解決方案&#xff0c;可用于解決跨庫操作的數據一致性問題&#xff1b; TCC是服務化的兩階段編程模型&#xff0c;其Try、Confirm、Cancel 3個方法均由業務編碼實現&#xff1b; 其中Try操作作為一階段&#xff0c;負責資源的檢查和…

量化投資策略的評估標準及其計算公式

收益率指標&#xff1a;分為策略的總收益率和策略的年化收益率 策略的總收益率&#xff1a; 策略的總收益率是評價一個策略盈利能力的最基本的指標&#xff0c;其計算方法為&#xff1a; 公式中Vt表示策略最終的股票和現金的總價值&#xff0c;V0表示策略最初的股票和現金的總…

.net post xml 數據

var request WebRequest.Create(url);//url 是post 接口的URL request.Method "post";// 請求方法 request.ContentType "text/xml"; //請求類型 request.Headers.Add("charset:utf-8"); //設置文檔類型的編碼格式 var encoding Encoding.Ge…

【ArcGIS微課1000例】0005:空間連接(Spatial Join)

問題描述 現在要根據范圍,怎樣批量統計各個范圍內的湖泊的總面積、各個省份內的鐵路或河流總長度、各個地區的人口綜合等。 空間連接 根據空間關系將一個要素類的屬性連接到另一個要素類的屬性。目標要素和來自連接要素的被連接屬性寫入到輸出要素類。 用法 空間連接是指根…

【微服務專題之】.Net6中集成消息隊列-RabbitMQ中直接路由模式

微信公眾號&#xff1a;趣編程ACE關注可了解更多的.NET日常實戰開發技巧&#xff0c;如需源碼 請公眾號后臺留言 源碼;[如果覺得本公眾號對您有幫助&#xff0c;歡迎關注]前文回顧【微服務專題之】.Net6下集成消息隊列上-RabbitMQ【微服務專題之】.Net6下集成消息隊列2-RabbitM…

C語言試題162之圓周率π

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:圓周率π…

第14、15教學周作業

要求一 還差一些沒做完。 要求二 USTH_C程序設計&#xff08;基礎&#xff09;14周第一次PTA作業 7-3 將數組中的數逆序存放 1.實驗代碼 #include<stdio.h>int main() {int i,n,t;scanf("%d",&n);int a[n];for(i0;i<n;i){scanf("%d",&t)…

篇三:訪問JSON靜態文件

背景&#xff1a;在定位的時候帶出車牌號的前兩位&#xff0c;這里就有一個地址和車牌號前兩位的映射關系&#xff0c;這個映射關系起初是通過Ajax在頁面加載的時候請求去數據庫里面查出來賦給一個變量&#xff0c;然后去操作&#xff0c;但是這個過程通常需要4~7秒&#xff0c…

代理(Proxy)

2019獨角獸企業重金招聘Python工程師標準>>> 一、代理的概念 動態代理技術是整個java技術中最重要的一個技術&#xff0c;它是學習java框架的基礎&#xff0c;不會動態代理技術&#xff0c;那么在學習Spring這些框架時是學不明白的。 動態代理技術就是用來產生一個對…

【ArcGIS微課1000例】0006:創建隨機點(Create Random Points)

問題描述 在一個給定的范圍內,根據隨機位置,生成指定數量的隨機點。生成的隨機點通常用來提取每個點對應的NDVI,高程,氣溫等值。 ArcGIS創建隨機點 創建指定數量的隨機點要素。可以在范圍窗口中、面要素內、點要素上或線要素沿線生成隨機點。 工具介紹:

C語言試題163之計算某一天是對應年的第幾天,這一年一共多少天;計算兩個日期之間相隔的天數。兩個日期由鍵盤輸入。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:計算某一…

[轉]《吐血整理》系列-頂級程序員工具集

你知道的越多&#xff0c;你不知道的越多 點贊再看&#xff0c;養成習慣 GitHub上已經開源 https://github.com/JavaFamily 有一線大廠面試點腦圖、個人聯系方式&#xff0c;歡迎Star和指教 前言 這期是被人才群交流里&#xff0c;還有很多之前網友評論強行頂出來的一期&#x…