Java多線程Semaphore工具的使用詳解
Semaphore 是一種用于控制線程并發(fā)訪問數(shù)的同步工具。它通過維護一定數(shù)量的許可證來限制對共享資源的訪問。 許可證的數(shù)量就是可以同時訪問共享資源的線程數(shù)目。
當一個線程需要訪問共享資源時,它必須先獲取一個許可證,如果沒有許可證可用,線程就會被阻塞,直到有一個許可證可用。 當一個線程完成了對共享資源的訪問后,它必須釋放一個許可證,以便其他線程可以獲取許可證繼續(xù)訪問共享資源。
雖然 Semaphore 主要用于限制并發(fā)訪問數(shù),但是在實際應用中,Semaphore 還可以用于線程之間的協(xié)作,比如實現(xiàn)線程的順序執(zhí)行、線程間的消息傳遞等等。 所以,Semaphore 并不僅僅是限制并發(fā)數(shù),它還可以用于實現(xiàn)更多的線程協(xié)作場景。
import java.util.concurrent.Semaphore;
/**
*
Semaphore 是一種用于控制線程并發(fā)訪問數(shù)的同步工具。它通過維護一定數(shù)量的許可證來限制對共享資源的訪問。
許可證的數(shù)量就是可以同時訪問共享資源的線程數(shù)目。
當一個線程需要訪問共享資源時,它必須先獲取一個許可證,如果沒有許可證可用,線程就會被阻塞,直到有一個許可證可用。
當一個線程完成了對共享資源的訪問后,它必須釋放一個許可證,以便其他線程可以獲取許可證繼續(xù)訪問共享資源。
雖然 Semaphore 主要用于限制并發(fā)訪問數(shù),但是在實際應用中,
Semaphore 還可以用于線程之間的協(xié)作,比如實現(xiàn)線程的順序執(zhí)行、線程間的消息傳遞等等。
所以,Semaphore 并不僅僅是限制并發(fā)數(shù),它還可以用于實現(xiàn)更多的線程協(xié)作場景。
*/
public class SemaphoreDemo {
public static void main(String[] args) {
//availablePermits(semaphore);
tryAcquire();
}
private static void tryAcquire() {
// 創(chuàng)建一個 Semaphore 對象,初始化許可證數(shù)量為 1
Semaphore semaphore = new Semaphore(1);
// 獲取一個許可證,獲取成功
boolean success1 = semaphore.tryAcquire();
System.out.println("success1: " + success1); // 輸出 true
// 再次獲取一個許可證,獲取失敗
boolean success2 = semaphore.tryAcquire();
System.out.println("success2: " + success2); // 輸出 false
// 釋放一個許可證
semaphore.release();
// 再次獲取一個許可證,獲取成功
boolean success3 = semaphore.tryAcquire();
System.out.println("success3: " + success3); // 輸出 true
}
private static void availablePermits() {
// 創(chuàng)建一個 Semaphore 對象,初始化許可證數(shù)量為 3
Semaphore semaphore = new Semaphore(3);
System.out.println("available permits: " + semaphore.availablePermits()); // 輸出 3
// 獲取一個許可證
try {
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("worker 1 is working...");
System.out.println("available permits: " + semaphore.availablePermits()); // 輸出 2
// 釋放一個許可證
semaphore.release();
System.out.println("worker 1 has finished his work.");
System.out.println("available permits: " + semaphore.availablePermits()); // 輸出 3
}
}package com.lfsun.highconcurrency000.juc.semaphore;
import java.util.concurrent.Semaphore;
/**
* 定義了一個 SemaphoreDemo 類和一個 Worker 類。SemaphoreDemo 類中創(chuàng)建了一個 Semaphore 對象,并初始化許可證數(shù)量為 3。
* 然后,創(chuàng)建 5 個 Worker 對象,并啟動 5 個線程。
*
* Worker 類實現(xiàn)了 Runnable 接口,表示線程的具體工作。
* 在 run 方法中,首先使用 acquire 方法獲取一個許可證,表示該線程需要訪問共享資源;
* 然后,進行一些模擬的工作,通過 sleep 方法暫停線程一段時間;最后,使用 release 方法釋放一個許可證,表示該線程已經(jīng)使用完共享資源。
* 在輸出中可以看到,最多只有 3 個線程同時訪問共享資源。
*
* 需要注意的是,acquire 和 release 方法都可能拋出 InterruptedException 異常,應該正確處理異常。
* 另外,應該根據(jù)實際需求調(diào)整 Semaphore 的許可證數(shù)量,以達到最優(yōu)的性能和效果。
*/
public class MySemaphoreDemo {
public static void main(String[] args) {
// 創(chuàng)建一個 Semaphore 對象,初始化許可證數(shù)量為 3
Semaphore semaphore = new Semaphore(3);
// 創(chuàng)建 5 個線程并啟動
for (int i = 1; i <= 5; i++) {
new Thread(new Worker(i, semaphore)).start();
}
}
}
class Worker implements Runnable {
private int id;
private Semaphore semaphore;
public Worker(int id, Semaphore semaphore) {
this.id = id;
this.semaphore = semaphore;
}
@Override
public void run() {
try {
// 獲取一個許可證
semaphore.acquire();
System.out.println("worker " + id + " is working...");
// 模擬工作過程
Thread.sleep((long) (Math.random() * 5000));
// 釋放一個許可證
semaphore.release();
System.out.println("worker " + id + " has finished his work.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}到此這篇關于Java多線程Semaphore工具的使用詳解的文章就介紹到這了,更多相關Java多線程Semaphore內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring 靜態(tài)變量/構造函數(shù)注入失敗的解決方案
我們經(jīng)常會遇到一下問題:Spring對靜態(tài)變量的注入為空、在構造函數(shù)中使用Spring容器中的Bean對象,得到的結果為空。不要擔心,本文將為大家介紹如何解決這些問題,跟隨小編來看看吧2021-11-11
SpringCloud超詳細講解負載均衡組件Ribbon源碼
在微服務中,對服務進行拆分之后,必然會帶來微服務之間的通信需求,而每個微服務為了保證高可用性,又會去部署集群,那么面對一個集群微服務進行通信的時候,如何進行負載均衡也是必然需要考慮的問題2022-07-07

