Java中的信號量是什麼以及如何使用它?

已發表: 2022-05-26

Sun Microsystems 於 1995 年為我們帶來了 Java,它是一種協作的、依賴於類和對象的編程語言和計算機平台。 除非您安裝了 Java,否則大量程序和網站將無法運行,並且每天都在開發更多。 Java 因其速度快、安全性和可靠性而受到市場歡迎並受到讚譽。 它是一種專門為在 Internet 的分散世界中使用而創建的計算機語言。 它牢記 C++ 編程語言的設計,但它更易於使用並強制執行面向對象的編程方法。

軟件開發中執行 PG 程序可以教您在 Java 中脫穎而出所需的所有技能。

信號量示例:

Shared var mutex: semaphore = 1;

進程 i

開始

.

.

P(互斥體);

執行 CS;

V(互斥體);

.

.

結尾;

目錄

是什麼讓 Java 脫穎而出?

一個由 Java 開發人員、架構師和愛好者組成的專門社區已經測試、完善、擴展和驗證了 Java。 儘管 Java 已有近 20 年的歷史,但多年來一直在穩步發展。

Java 旨在促進為各種計算機系統開發可移植的高性能程序,從而支持包含可訪問性和跨平台交互的基本概念。 企業可以提供額外的服務,提高最終用戶的工作效率、通信和協作,並通過使它們在異構環境中可用而大大降低企業和消費者應用程序的成本。

Java中的信號量是什麼?

信號量使用計數器來規範對共享資源的訪問。 如果計數器大於零,則允許訪問。 如果值為 0,則拒絕訪問。 計數器計數提供對共享資源的訪問權限的許可。 因此,要訪問資源,線程必須首先從信號量獲得許可。

它是如何工作的?

通常,在使用信號量時,嘗試訪問共享資源的線程會嘗試獲得許可。 如果信號量計數大於零,則線程獲得許可,導致信號量計數減少。 如果沒有,線程將被暫停,直到獲得許可。

當線程不再需要訪問共享資源時,它會釋放許可,導致信號量計數增加。 如果另一個線程正在等待許可,則該線程將在那一刻獲得一個。

信號量的類型

Java中有四種類型的信號量。 它們如下:

二進制信號量

二進制信號量僅接受 0 和 1 作為值,用於創建互斥和同步並發活動。

二進制信號量示例:

公共類 BinarySemaphoreExample

{

私人布爾鎖定=假;

二進制信號量(int 初始值)

{

鎖定=(初始== 0);

}

公共同步 void waitForNotify() 拋出 InterruptedException

{

而(鎖定)

{

等待();

}

鎖定=真;

}

公共同步無效 notifyToWakeup()

{

如果(鎖定)

{

通知();

}

鎖定=假;

}

}

閱讀我們與軟件開發相關的熱門文章

如何在 Java 中實現數據抽象? Java中的內部類是什麼? Java 標識符:定義、語法和示例
通過示例了解 OOPS 中的封裝 C 中的命令行參數解釋 2022 年雲計算的 10 大特點和特點
Java 中的多態性:概念、類型、特徵和示例 Java 中的包以及如何使用它們? Git 初學者教程:從零開始學習 Git

計數信號量

在每一時刻,一個計數信號量的值代表了可以同時訪問臨界區的最大進程數。

計數信號量示例:

公共類 CountingSemaphoreExample

{

私人 int 信號 = 0;

公共同步 void take()

{

這個.信號++;

this.notify();

}

公共同步無效釋放()拋出 InterruptedException

{

而(this.signal == 0)

等待();

this.signal-;

}

}

定時信號量:

定時信號量使線程能夠運行一段設定的時間。 一段時間後,計時器重置並釋放所有其他許可。

定時信號量示例:

類 TimedSemaphoresExample

{

私有 TimedSemaphore 信號量;

TimedSemaphoreExample(長周期,int slotLimit)

{

semaphore = new TimedSemaphore(period, TimeUnit.SECONDS, slotLimit);

}

布爾值 tryAdd()

{

返回信號量.tryAcquire();

}

int 可用插槽()

{

返回信號量.getAvailablePermits();

}

}

有界信號量

我們可以使用有界信號量設置上限。 它被用來代替計算信號量,因為它們沒有上限值。 上限值表示可以存儲的最大信號數。

有界信號量示例

公共類 BoundedSemaphoresExample

{

私人 int 信號 = 0;

私有int綁定= 0;

公共 BoundedSemaphoreexample(int upperBound)

{

this.bound = 上界;

}

公共無效同步take()拋出InterruptedException

{

而(this.signals == 綁定)

等待();

this.signals++;

this.notify++;

}

公共無效同步釋放()拋出InterruptedException

{

而(this.signal == 0)

等待();

this.signals-;

}

}

探索我們流行的軟件工程課程

SL。 不 軟件開發計劃
1 LJMU & IIITB 計算機科學碩士 加州理工學院 CTME 網絡安全證書課程
2 全棧開發訓練營 區塊鏈中的 PG 程序
3 軟件開發行政研究生課程 - DevOps 專業化 查看所有軟件工程課程

特徵:

信號量具有以下特點:

  • 它允許線程相互通信。
  • 它降低了同步度。 因此,它提供了一種低級同步方法。
  • 信號量中沒有負值。 它的值可以大於或等於零。
  • 我們可以使用測試操作和中斷來實現信號量,並使用文件描述符來執行它。

信號量的優缺點:

優點:

  1. 它使許多線程能夠到達要害部分。
  2. 信號量與機器無關。
  3. 信號量在微內核的機器無關代碼中實現。
  4. 不允許多個進程訪問關鍵部分。
  5. 不會浪費處理時間或資源,因為信號量中總是有一個忙碌的等待。
  6. 它們是機器獨立的,因此應該在微內核的機器獨立代碼中運行。
  7. 它們支持適應性強的資源管理。

缺點:

  1. 優先級反轉是信號量最重要的限制之一。
  2. 操作系統必須跟踪所有等待和信號量調用。
  3. 它們的使用從未被強制要求,而只是根據傳統。
  4. 必須正確執行等待和信號操作以避免信號量中的死鎖。
  5. 因為信號量編程比較複雜,所以有可能無法實現互斥。
  6. 對於大規模應用程序來說,這也不是一個現實的策略,因為它會導致模塊化的損失。
  7. 信號量更容易受到編程錯誤的影響。
  8. 編程錯誤可能導致死鎖或違反互斥。

如何使用信號量作為鎖?

信號量可以用作 Java 中的鎖。 它表示它限制對資源的訪問。 要獲取鎖,任何想要訪問鎖定資源的線程都必須首先調用acquire() 函數。 完成工作後,線程必須通過調用 release() 函數來釋放鎖。 請記住,上限應設置為 1。全棧開發中的執行 PG 課程將幫助您掌握所有這些技能。

概括

對 Java 等編程語言有清晰的認識對於軟件開發人員的光明職業生涯至關重要。 upGrad提供了幾門課程,這些課程可能會為您提供有前途的職業的正確選擇。 普魯德大學upGrad的全棧開發專業將教您在軟件開發領域蓬勃發展所需的所有技能。

從世界頂級大學在線學習軟件開發課程獲得行政 PG 課程、高級證書課程或碩士課程,以加快您的職業生涯。

為什麼我們需要 Java 中的信號量?

信號量是用於進程同步以管理並發進程的變量。 它還通過控制多個並發進程對共享資源的訪問來防止競爭問題。

為什麼我們需要計數信號量?

信號量通常用於協調資源訪問,信號量計數設置為總資源列表。 當給定或添加資源時,線程原子地增加計數,當資源被撤回時,線程原子地減少計數。

為什麼 Semaphore 被稱為同步工具?

信號量本質上是一個被許多線程共享的整數變量。 在多處理環境中使用該變量來克服臨界區問題並建立進程同步。 這有時被稱為互斥鎖。

什麼是全棧開發?

全棧開發是創建 Web 應用程序的前端(客戶端)和後端(服務器端)組件。 全棧 Web 開發人員可以創建成熟的在線應用程序和網站。 他們負責在線應用程序或網站的前端、後端、數據庫和調試。