日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

Java并發(fā)編程實(shí)戰(zhàn):信號(hào)量Semaphore的使用技巧與示例

來源: 責(zé)編: 時(shí)間:2024-04-10 08:36:03 182觀看
導(dǎo)讀在如今競爭激烈的軟件開發(fā)環(huán)境中,掌握多線程編程已經(jīng)成為開發(fā)者的必備技能。在這個(gè)過程中,如何巧妙地解決資源訪問的問題,是每個(gè)Java開發(fā)者需要面對(duì)的挑戰(zhàn)。信號(hào)量的基本概念在多線程編程中,信號(hào)量(Semaphore)就像是資源訪

6bs28資訊網(wǎng)——每日最新資訊28at.com

在如今競爭激烈的軟件開發(fā)環(huán)境中,掌握多線程編程已經(jīng)成為開發(fā)者的必備技能。在這個(gè)過程中,如何巧妙地解決資源訪問的問題,是每個(gè)Java開發(fā)者需要面對(duì)的挑戰(zhàn)。6bs28資訊網(wǎng)——每日最新資訊28at.com

信號(hào)量的基本概念

在多線程編程中,信號(hào)量(Semaphore)就像是資源訪問的“交通指揮員”,通過管理許可集,巧妙地控制同時(shí)訪問共享資源的線程數(shù)量。信號(hào)量的核心理念包括許可集的管理、調(diào)度,以及許可的獲取和釋放機(jī)制6bs28資訊網(wǎng)——每日最新資訊28at.com

  • 許可集的管理:許可集是信號(hào)量(Semaphore)的核心組成部分,它是一個(gè)計(jì)數(shù)器,用于記錄可用的許可數(shù)量。許可集的管理主要涉及到許可的增加和減少。當(dāng)一個(gè)線程請(qǐng)求許可時(shí),如果許可集中有可用許可,那么許可集的計(jì)數(shù)器就會(huì)減一,表示一個(gè)許可已經(jīng)被使用。反之,當(dāng)線程釋放許可時(shí),許可集的計(jì)數(shù)器就會(huì)增一,表示一個(gè)許可已經(jīng)被釋放并可以被再次使用。
  • 許可集的調(diào)度:許可集的調(diào)度是指信號(hào)量如何根據(jù)許可集的狀態(tài)來調(diào)度線程的執(zhí)行。當(dāng)許可集中沒有可用許可時(shí),請(qǐng)求許可的線程會(huì)被阻塞,直到有其他線程釋放許可。這種機(jī)制可以確保在任何時(shí)刻,訪問特定資源的線程數(shù)量不會(huì)超過許可集的大小,從而有效地控制了資源的并發(fā)訪問。
  • 許可的獲取:許可的獲取是指線程通過調(diào)用信號(hào)量的acquire()方法來請(qǐng)求許可。如果許可集中有可用許可,那么線程可以立即獲取許可并繼續(xù)執(zhí)行。如果沒有可用許可,那么線程會(huì)被阻塞,直到有其他線程釋放許可。這種機(jī)制可以確保在任何時(shí)刻,訪問特定資源的線程數(shù)量不會(huì)超過許可集的大小。
  • 許可的釋放機(jī)制:許可的釋放是指線程在完成對(duì)特定資源的訪問后,通過調(diào)用信號(hào)量的release()方法來釋放許可。釋放許可后,許可集的計(jì)數(shù)器會(huì)增一,表示一個(gè)許可已經(jīng)被釋放并可以被再次使用。如果有其他線程正在等待許可,那么這個(gè)線程會(huì)被喚醒并獲取到許可。這種機(jī)制可以確保資源在被使用后能夠及時(shí)地被其他線程獲取并使用,從而提高了資源的利用率。

信號(hào)量的運(yùn)作方式

信號(hào)量(Semaphore)的運(yùn)作方式主要涉及到四個(gè)步驟:初始化、許可的獲取、資源的訪問和許可的釋放6bs28資訊網(wǎng)——每日最新資訊28at.com

6bs28資訊網(wǎng)——每日最新資訊28at.com

  • 初始化:在創(chuàng)建信號(hào)量時(shí),需要指定許可的初始數(shù)量,這個(gè)數(shù)量代表了同時(shí)可以訪問某一特定資源的線程數(shù)量。例如,如果我們創(chuàng)建一個(gè)初始許可數(shù)量為3的信號(hào)量,那么就意味著最多只能有3個(gè)線程同時(shí)訪問某一特定資源。
  • 許可的獲取:線程在訪問特定資源之前,需要先通過調(diào)用信號(hào)量的acquire()方法來獲取許可。如果當(dāng)前信號(hào)量中有可用許可,那么線程可以立即獲取許可并繼續(xù)執(zhí)行。如果沒有可用許可,那么線程會(huì)被阻塞,直到有其他線程釋放許可。
  • 資源的訪問:線程在獲取到許可后,就可以開始訪問特定資源。在訪問資源的過程中,其他線程無法訪問這個(gè)資源,除非它們也獲取到了許可。
  • 許可的釋放:線程在完成對(duì)特定資源的訪問后,需要通過調(diào)用信號(hào)量的release()方法來釋放許可。釋放許可后,信號(hào)量中的可用許可數(shù)量會(huì)增加,如果有其他線程正在等待許可,那么這個(gè)線程會(huì)被喚醒并獲取到許可。

通過這種方式,信號(hào)量實(shí)現(xiàn)了對(duì)特定資源并發(fā)訪問的控制,確保了在任何時(shí)刻,訪問特定資源的線程數(shù)量不會(huì)超過信號(hào)量中的許可數(shù)量。6bs28資訊網(wǎng)——每日最新資訊28at.com

6bs28資訊網(wǎng)——每日最新資訊28at.com

信號(hào)量的應(yīng)用實(shí)例

  • 限制并發(fā)訪問數(shù)量:在許多場景中,我們需要限制同時(shí)訪問某一資源的線程數(shù)量,例如數(shù)據(jù)庫連接。如果過多的線程同時(shí)訪問數(shù)據(jù)庫,可能會(huì)導(dǎo)致數(shù)據(jù)庫壓力過大,影響系統(tǒng)性能。這時(shí),我們可以使用信號(hào)量來限制并發(fā)訪問數(shù)量。例如,我們可以創(chuàng)建一個(gè)初始許可數(shù)量為10的信號(hào)量,這樣最多只能有10個(gè)線程同時(shí)訪問數(shù)據(jù)庫。
  • 資源池:信號(hào)量也常用于實(shí)現(xiàn)資源池,例如數(shù)據(jù)庫連接池、線程池等。資源池中的每一個(gè)資源都對(duì)應(yīng)一個(gè)許可,當(dāng)線程需要使用資源時(shí),必須先從信號(hào)量獲取許可,獲取許可后才能使用資源。當(dāng)線程使用完資源后,必須釋放許可,這樣其他需要使用資源的線程才能獲取許可。這種機(jī)制可以有效地控制資源的使用,避免資源的浪費(fèi)。

如何正確使用信號(hào)量

  • 合理設(shè)置許可數(shù)量:許可數(shù)量是信號(hào)量的核心參數(shù),它決定了同時(shí)可以訪問某一資源的線程數(shù)量。設(shè)置許可數(shù)量時(shí),需要根據(jù)實(shí)際情況來決定,不能過大也不能過小。如果許可數(shù)量過大,可能會(huì)導(dǎo)致資源被過度使用,影響系統(tǒng)性能;如果許可數(shù)量過小,可能會(huì)導(dǎo)致線程頻繁阻塞,影響系統(tǒng)吞吐量。
  • 正確處理異常:在獲取和釋放許可的過程中,可能會(huì)出現(xiàn)異常,例如線程被中斷。這時(shí),我們需要正確處理異常,確保許可能夠被正確釋放,避免資源泄露。
  • 避免死鎖:在使用信號(hào)量時(shí),需要注意避免死鎖。例如,如果線程A持有信號(hào)量1的許可,同時(shí)試圖獲取信號(hào)量2的許可,而線程B持有信號(hào)量2的許可,同時(shí)試圖獲取信號(hào)量1的許可,那么就可能出現(xiàn)死鎖。為了避免死鎖,我們可以使用一種叫做“順序加鎖”的技術(shù),即按照一定的順序獲取許可。
  • 使用try-finally確保許可的釋放:在獲取許可后,我們通常會(huì)執(zhí)行一些操作,然后釋放許可。為了確保許可能夠被正確釋放,無論操作是否成功,我們應(yīng)該把釋放許可的代碼放在finally塊中。

示例代碼解析

以下是一個(gè)簡單而具有代表性的示例,我們可以清晰地看到Semaphore在多線程任務(wù)中的應(yīng)用。6bs28資訊網(wǎng)——每日最新資訊28at.com

import java.util.concurrent.Semaphore;public class SemaphoreExample {    // 創(chuàng)建一個(gè)初始許可數(shù)量為3的信號(hào)量    private static final Semaphore semaphore = new Semaphore(3);    public static void main(String[] args) {        // 創(chuàng)建10個(gè)線程        for (int i = 0; i < 10; i++) {            new Thread(new Worker()).start();        }    }    static class Worker implements Runnable {        @Override        public void run() {            try {                // 獲取許可                semaphore.acquire();                System.out.println("線程 " + Thread.currentThread().getName() + " 獲取到許可,開始執(zhí)行任務(wù)");                // 模擬耗時(shí)操作                Thread.sleep(2000);                System.out.println("線程 " + Thread.currentThread().getName() + " 任務(wù)執(zhí)行完畢,釋放許可");            } catch (InterruptedException e) {                e.printStackTrace();            } finally {                // 釋放許可                semaphore.release();            }        }    }}

結(jié)語

信號(hào)量作為實(shí)戰(zhàn)多線程編程的得力助手,通過合理的使用,可以有效地解決資源訪問的問題,提高程序的并發(fā)性能。然而,信號(hào)量的使用并非易事,需要深入理解其運(yùn)作原理和應(yīng)用場景,才能在實(shí)際開發(fā)中靈活運(yùn)用。6bs28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-82508-0.htmlJava并發(fā)編程實(shí)戰(zhàn):信號(hào)量Semaphore的使用技巧與示例

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 詳解Pinia持久化插件pinia-plugin-persist在Vue3中的應(yīng)用與實(shí)踐

下一篇: 前端面試:你以為這只是一個(gè)簡單的數(shù)組去重嗎?

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 6月iOS設(shè)備性能榜:M2穩(wěn)居榜首 A系列只能等一手3nm來救

    沒有新品發(fā)布,自然iOS設(shè)備性能榜的上榜設(shè)備就沒有什么更替,僅僅只有跑分變化而產(chǎn)生的排名變動(dòng),畢竟蘋果新品的發(fā)布節(jié)奏就是這樣的,一年下來也就幾個(gè)移動(dòng)端新品,不會(huì)像安卓廠商,一
  • 5月iOS設(shè)備好評(píng)榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個(gè)榜單又重新匯總了數(shù)據(jù),像安卓陣營的榜單都有著比較大的變動(dòng),不過iOS由于設(shè)備的更新?lián)Q代并沒有那么快,所以相對(duì)來說變化并不大,特別是iOS好評(píng)榜,老款設(shè)
  • Flowable工作流引擎的科普與實(shí)踐

    一.引言當(dāng)我們?cè)谌粘9ぷ骱蜆I(yè)務(wù)中需要進(jìn)行各種審批流程時(shí),可能會(huì)面臨一系列技術(shù)和業(yè)務(wù)上的挑戰(zhàn)。手動(dòng)處理這些審批流程可能會(huì)導(dǎo)致開發(fā)成本的增加以及業(yè)務(wù)復(fù)雜度的上升。在這
  • 學(xué)習(xí)JavaScript的10個(gè)理由...

    作者 | Simplilearn編譯 | 王瑞平當(dāng)你決心學(xué)習(xí)一門語言的時(shí)候,很難選擇到底應(yīng)該學(xué)習(xí)哪一門,常用的語言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 在線圖片編輯器,支持PSD解析、AI摳圖等

    自從我上次分享一個(gè)人開發(fā)仿造稿定設(shè)計(jì)的圖片編輯器到現(xiàn)在,不知不覺已過去一年時(shí)間了,期間我經(jīng)歷了裁員失業(yè)、面試找工作碰壁,寒冬下一直沒有很好地履行計(jì)劃.....這些就放在日
  • JVM優(yōu)化:實(shí)戰(zhàn)OutOfMemoryError異常

    一、Java堆溢出堆內(nèi)存中主要存放對(duì)象、數(shù)組等,只要不斷地創(chuàng)建這些對(duì)象,并且保證 GC Roots 到對(duì)象之間有可達(dá)路徑來避免垃 圾收集回收機(jī)制清除這些對(duì)象,當(dāng)這些對(duì)象所占空間超過
  • 小米MIX Fold 3配置細(xì)節(jié)曝光:搭載領(lǐng)先版驍龍8 Gen2+罕見5倍長焦

    這段時(shí)間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都得到了不少爆料,而小米新一代折疊屏旗艦——小米MIX Fold 3此前也屢屢被傳
  • 三星Galaxy Z Fold5今日亮相:厚度縮減但仍略顯厚重

    據(jù)官方此前宣布,三星將于7月26日也就是今天在韓國首爾舉辦Unpacked活動(dòng),屆時(shí)將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • 北京:科技教育體驗(yàn)基地開始登記

      北京“科技館之城”科技教育體驗(yàn)基地登記和認(rèn)證工作日前啟動(dòng)。首批北京科技教育體驗(yàn)基地?cái)M于2023年全國科普日期間掛牌,后續(xù)還將開展常態(tài)化登記。  北京科技教育體驗(yàn)基
Top 主站蜘蛛池模板: 布拖县| 亳州市| 铜梁县| 图木舒克市| 凤庆县| 承德县| 元江| 乡宁县| 繁峙县| 宝山区| 水富县| 景德镇市| 观塘区| 天峨县| 彝良县| 松滋市| 张掖市| 泸西县| 钦州市| 天长市| 龙南县| 金阳县| 青海省| 都江堰市| 顺昌县| 乡宁县| 上蔡县| 纳雍县| 汉沽区| 额济纳旗| 丹凤县| 黎平县| 大竹县| 福贡县| 安福县| 依兰县| 崇明县| 仙桃市| 万载县| 扎鲁特旗| 崇左市|