ReentrantLock實現公平鎖和非公平鎖

在 Java 里,公平鎖和非公平鎖是多線程編程中用于同步的兩種鎖機制,它們的主要差異在于獲取鎖的順序規則。下面是對二者的詳細介紹:

公平鎖

公平鎖遵循 “先來先服務” 原則,也就是線程獲取鎖的順序和請求鎖的順序一致。先請求鎖的線程會優先獲得鎖,這樣可以保證每個線程都有公平的機會獲取鎖,避免某個線程長時間等待。

不過,公平鎖在實現公平性時會增加額外的開銷,因為需要維護一個有序的等待隊列。當一個線程釋放鎖后,會從隊列頭部選取下一個線程來獲取鎖。

非公平鎖

非公平鎖不保證線程獲取鎖的順序和請求鎖的順序一致。當鎖被釋放時,任何等待的線程都有機會獲取鎖,而不考慮其請求的先后順序。

非公平鎖可能會讓某些線程先于等待時間長的線程獲取鎖,從而產生 “饑餓” 現象,即部分線程長時間得不到鎖。但非公平鎖的性能通常比公平鎖要好,因為它減少了線程上下文切換和等待隊列管理的開銷。

實現公平鎖和非公平鎖

在創建ReentrantLock時可以指定true或者false在指定公平或者非公平鎖(ReentrantLock和Synchronized關鍵字默認是非公平鎖),像下面這樣

// 創建公平鎖
Lock fairLock = new ReentrantLock(true);
// 創建非公平鎖
Lock unfairLock = new ReentrantLock(false);

如下是測試ReentrantLock實現公平鎖和非公平鎖的代碼

class Worker implements Runnable {private final Lock lock;private final String name;public Worker(Lock lock, String name) {this.lock = lock;this.name = name;}@Overridepublic void run() {for (int i = 0; i < 3; i++) {lock.lock();try {System.out.println(name + " 獲得鎖,正在執行任務 " + i);Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();System.out.println(name + " 釋放鎖");}}}
}public class FairAndUnFair {public static void main(String[] args) {// 創建公平鎖Lock fairLock = new ReentrantLock(true);// 創建非公平鎖Lock unfairLock = new ReentrantLock(false);// 使用公平鎖System.out.println("使用公平鎖:");Thread t1 = new Thread(new Worker(fairLock, "線程1"));Thread t2 = new Thread(new Worker(fairLock, "線程2"));t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}// 使用非公平鎖System.out.println("\n使用非公平鎖:");t1 = new Thread(new Worker(unfairLock, "線程1"));t2 = new Thread(new Worker(unfairLock, "線程2"));t1.start();t2.start();}
}

在這個示例中,ReentrantLock構造函數的參數true表示創建公平鎖,false表示創建非公平鎖。

適用場景

  • 公平鎖:適用于對公平性要求較高的場景,如任務調度系統,需要保證每個任務都能按順序執行。
  • 非公平鎖:適用于對性能要求較高,且對公平性要求較低的場景,如高并發的緩存系統。

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

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

相關文章

一篇擼清 Http,SSE 與 WebSocket

HTTP,SSE 和WebSocket都是網絡傳輸的協議,本篇快速介紹三者的概念和比較。 SSE(Server-Sent Events) 是什么? SSE(Server-Sent Events),服務器發送事件, 是一種基于 HTTP 的輕量級協議,允許服務器主動向客戶端(如瀏覽器)推送實時數據。它設計用于單向通信(服務器到…

5個重要的財務指標講解

1&#xff09;凈資產收益率 2&#xff09;銷售凈利率 3&#xff09; 銷售毛利率 4&#xff09;銷售成本率 5&#xff09; 期間費用率 好的&#xff0c;我將通過一個假設的案例&#xff08;某公司2023年數據&#xff09;逐步解釋這些財務指標&#xff0c;并用具體數字演示計算…

PISI:眼圖1:眼圖相關基本概念

0 英文縮寫 TIE&#xff08;Time Interval Error&#xff09;時間間隔誤差&#xff0c;UI&#xff08;Unit Interval&#xff09;單位間隔PDF&#xff08;Probability Density Function&#xff09;概率密度函數BER&#xff08;Bit Error Rate&#xff09;誤碼率TJ&#xff08…

前端八股 CSS 2 選擇器

選擇器功能&#xff1a;選中特定 DOM節點進行渲染 原始方法 getElementById() getElementByName() 現在方法選擇器 分類&#xff1a; id選擇器 類選擇器 標簽選擇器 邏輯與選擇器 其他類型選擇器&#xff1a; 偽類選擇器&#xff1a; :link&#xff1a;未被訪問的鏈接…

算法競賽進階指南.闇の連鎖

目錄 題目算法標簽: 樹上差分, L C A LCA LCA, 倍增思路代碼 題目 352. 闇の連鎖 算法標簽: 樹上差分, L C A LCA LCA, 倍增 思路 對于一個無向圖, 第一次切斷樹邊, 第二次切非樹邊, 一共多少種方案使得圖不連通, 點數和邊數都很大, 時間復雜度不能是 O ( n 2 ) O(n ^ 2…

ActiveMQ 與其他 MQ 的對比分析:Kafka/RocketMQ 的選型參考(二)

ActiveMQ、Kafka 和 RocketMQ 詳細對比 性能對比 在性能方面&#xff0c;Kafka 和 RocketMQ 通常在高吞吐量場景下表現出色&#xff0c;而 ActiveMQ 則相對較弱。根據相關測試數據表明&#xff0c;Kafka 在處理大規模日志數據時&#xff0c;單機吞吐量可以達到每秒數十萬條甚…

Electron 從零開始:構建你的第一個桌面應用

&#x1f5a5;? Electron 從零開始&#xff1a;構建你的第一個桌面應用 Electron 是一個可以使用 HTML、CSS 和 JavaScript 構建跨平臺桌面應用的框架。它將 Chromium 和 Node.js 融合到一個環境中&#xff0c;使 Web 開發者也能輕松開發原生桌面應用。 &#x1f680; 什么是 …

相向雙指針-16. 最接近的三數之和

16. 最接近的三數之和 題目描述思路講解代碼展示復雜度分析相關標簽 題目描述 思路講解 思路和 15. 三數之和 類似&#xff0c;排序后&#xff0c;枚舉 nums[i] 作為第一個數&#xff0c;那么問題變成找到另外兩個數&#xff0c;使得這三個數的和與 target 最接近&#xff0c;…

C 語 言 - - - 文 件 操 作

C 語 言 - - - 文 件 操 作 文 件文 件 名文 件 操 作fopenfclose 文 件 的 順 序 讀 寫fputcfgetcfputsfgetsfprintffscanffwritefread 流文 件 的 隨 機 讀 寫fseekftellrewind 總結 &#x1f4bb;作 者 簡 介&#xff1a;曾 與 你 一 樣 迷 茫&#xff0c;現 以 經 驗 助 你…

Walrus 與 Pudgy Penguins 達成合作,為 Web3 頭部 IP 引入去中心化存儲

以將深受喜愛的數字藏品賦予生命而聞名的 IP 與品牌開發公司 Pudgy Penguins&#xff0c;現已集成 Walrus&#xff0c;用于存儲和管理其日益增長的數字媒體資源庫&#xff0c;包括在其產品和社區體驗中使用的貼紙和 GIF。團隊將率先通過 Tusky&#xff08;Walrus 的用戶友好型文…

2019ICPC陜西省賽暨陜西邀請賽題解 BCDEF HIJKL

共111支隊伍&#xff0c;獲獎情況&#xff08;大概&#xff09; 銅牌66 —— 3 296 銀牌33 —— 4 391 金牌 11 —— 6 808 題目難度&#xff08;過題&#xff09;L F E B C I J D K H Problem - L - Codeforces 思路&#xff1a;注意到答案是連乘&#xff0c;只要有0…

5塊錢的無憂套餐卡可以變成流量卡嗎

電信的 5 塊錢無憂套餐卡理論上可以變成流量卡&#xff0c;但會受到一些條件限制&#xff0c;以下是具體介紹&#xff1a; 中國電信無憂卡簡介 中國電信無憂卡是電信推出的低月租套餐&#xff0c;月租僅 5 元&#xff0c;包含 200M 國內流量、來電顯示和 189 郵箱&#xff0c;全…

SpringBoot校園失物招領平臺源碼開發實現

概述 實用的??SpringBoot校園失物招領平臺??完整項目源碼&#xff0c;幫助開發者快速構建校園失物招領系統。該項目采用SpringBootVue前后端分離架構&#xff0c;包含完整的注冊登錄、信息發布、認領管理等模塊&#xff0c;是學習企業級項目開發的優秀范例 主要內容 1. …

如何在純C中實現類、繼承和多態(小白友好版)

基本實現原理 /* 通過結構體函數指針模擬類 */ typedef struct {// 成員變量int x; // 成員方法&#xff08;函數指針&#xff09; void (*print)(void* self); } MyClass;/* 成員函數實現 */ void my_print(void* self) {MyClass* obj (MyClass*)self;p…

51單片機入門教程——每個音符對應的重裝載值

前言 本教程基于B站江協科技課程進行個人學習整理&#xff0c;專為擁有C語言基礎的零基礎入門51單片機新手設計。既幫助解決因時間差導致的設備迭代調試難題&#xff0c;也助力新手快速掌握51單片機核心知識&#xff0c;實現從C語言理論到單片機實踐應用的高效過渡 。

股票單因子的檢驗方法有哪些?

股票單因子的檢驗方法主要包括以下四類方法及相關指標&#xff1a; 一、統計指標檢驗 IC值分析法 定義&#xff1a;IC值&#xff08;信息系數&#xff09;衡量因子值與股票未來收益的相關性&#xff0c;包括兩種計算方式&#xff1a; Normal IC&#xff1a;基于Pearson相關系數…

洛谷 P8606 [藍橋杯 2013 國 B] 高僧斗法 博弈論

題目 傳送門 P8606 [藍橋杯 2013 國 B] 高僧斗法 - 洛谷 思路 這個題就比較考驗博弈的基本題型和轉換能力了&#xff1b; 這個題是nim博弈>階梯博弈 再將小和尚的移動轉化為階梯上石子的移動&#xff1a;兩個小和尚之間可以移動的距離&#xff0c;看做階梯上的石子&…

《政治最后的日子》章節

政治與中世紀教會的類比性衰落 作者提出現代民族國家正重復中世紀教會的衰落軌跡&#xff1a; 兩者均曾作為社會組織核心存在約5個世紀 晚期都成為生產力阻礙&#xff08;中世紀教會稅收負擔/現代國家官僚低效&#xff09; 末期均出現管理者普遍腐敗與公眾蔑視&#xff08;…

微軟開源推理模型:Phi-4-reasoning-plus

Phi-4-reasoning-plus 技術解讀 一、模型概述 Phi-4-reasoning-plus 是微軟研究院開發的一種前沿開源推理模型&#xff0c;基于 Phi-4 通過監督微調和強化學習進一步訓練而成。該模型專注于高質量和高級推理能力的培養&#xff0c;旨在為小型高效模型提供強大的推理性能。其訓…

文學與社會學是否只是在做解釋的工作?

目錄 一、文學&#xff1a;從抒情到解釋的轉變 &#xff08;一&#xff09;文學從來不只是“虛構” &#xff08;二&#xff09;文學的解釋&#xff0c;是“經驗的再組織” 二、社會學&#xff1a;用理論語言重寫社會現實 &#xff08;一&#xff09;社會學的“科學化”與…