欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java多線程Semaphore工具的使用詳解

 更新時間:2023年05月10日 09:26:18   作者:lfsun666  
Semaphore 是一種用于控制線程并發(fā)訪問數(shù)的同步工具。它通過維護(hù)一定數(shù)量的許可證來限制對共享資源的訪問,許可證的數(shù)量就是可以同時訪問共享資源的線程數(shù)目,需要的朋友可以參考下

Semaphore 是一種用于控制線程并發(fā)訪問數(shù)的同步工具。它通過維護(hù)一定數(shù)量的許可證來限制對共享資源的訪問。 許可證的數(shù)量就是可以同時訪問共享資源的線程數(shù)目。

當(dāng)一個線程需要訪問共享資源時,它必須先獲取一個許可證,如果沒有許可證可用,線程就會被阻塞,直到有一個許可證可用。 當(dāng)一個線程完成了對共享資源的訪問后,它必須釋放一個許可證,以便其他線程可以獲取許可證繼續(xù)訪問共享資源。

雖然 Semaphore 主要用于限制并發(fā)訪問數(shù),但是在實際應(yīng)用中,Semaphore 還可以用于線程之間的協(xié)作,比如實現(xiàn)線程的順序執(zhí)行、線程間的消息傳遞等等。 所以,Semaphore 并不僅僅是限制并發(fā)數(shù),它還可以用于實現(xiàn)更多的線程協(xié)作場景。

import java.util.concurrent.Semaphore;
/**
 *
 Semaphore 是一種用于控制線程并發(fā)訪問數(shù)的同步工具。它通過維護(hù)一定數(shù)量的許可證來限制對共享資源的訪問。
 許可證的數(shù)量就是可以同時訪問共享資源的線程數(shù)目。
 當(dāng)一個線程需要訪問共享資源時,它必須先獲取一個許可證,如果沒有許可證可用,線程就會被阻塞,直到有一個許可證可用。
 當(dāng)一個線程完成了對共享資源的訪問后,它必須釋放一個許可證,以便其他線程可以獲取許可證繼續(xù)訪問共享資源。
 雖然 Semaphore 主要用于限制并發(fā)訪問數(shù),但是在實際應(yīng)用中,
 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 方法獲取一個許可證,表示該線程需要訪問共享資源;
 * 然后,進(jìn)行一些模擬的工作,通過 sleep 方法暫停線程一段時間;最后,使用 release 方法釋放一個許可證,表示該線程已經(jīng)使用完共享資源。
 * 在輸出中可以看到,最多只有 3 個線程同時訪問共享資源。
 *
 * 需要注意的是,acquire 和 release 方法都可能拋出 InterruptedException 異常,應(yīng)該正確處理異常。
 * 另外,應(yīng)該根據(jù)實際需求調(diào)整 Semaphore 的許可證數(shù)量,以達(dá)到最優(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();
        }
    }
}

到此這篇關(guān)于Java多線程Semaphore工具的使用詳解的文章就介紹到這了,更多相關(guān)Java多線程Semaphore內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring 靜態(tài)變量/構(gòu)造函數(shù)注入失敗的解決方案

    Spring 靜態(tài)變量/構(gòu)造函數(shù)注入失敗的解決方案

    我們經(jīng)常會遇到一下問題:Spring對靜態(tài)變量的注入為空、在構(gòu)造函數(shù)中使用Spring容器中的Bean對象,得到的結(jié)果為空。不要擔(dān)心,本文將為大家介紹如何解決這些問題,跟隨小編來看看吧
    2021-11-11
  • Spring-Boot中如何使用多線程處理任務(wù)方法

    Spring-Boot中如何使用多線程處理任務(wù)方法

    這篇文章主要介紹了Spring-Boot中如何使用多線程處理任務(wù)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • spring boot 配置動態(tài)刷新詳解

    spring boot 配置動態(tài)刷新詳解

    這篇文章主要介紹了spring boot 配置動態(tài)刷新實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-09-09
  • Java并發(fā)編程變量可見性避免指令重排使用詳解

    Java并發(fā)編程變量可見性避免指令重排使用詳解

    這篇文章主要為大家介紹了Java并發(fā)編程變量可見性避免指令重排使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 關(guān)于Spring中@Lazy注解的使用

    關(guān)于Spring中@Lazy注解的使用

    這篇文章主要介紹了關(guān)于Spring中@Lazy注解的使用,@Lazy注解用于標(biāo)識bean是否需要延遲加載,沒加注解之前主要容器啟動就會實例化bean,本文提供了部分實現(xiàn)代碼,需要的朋友可以參考下
    2023-08-08
  • SpringCloud超詳細(xì)講解負(fù)載均衡組件Ribbon源碼

    SpringCloud超詳細(xì)講解負(fù)載均衡組件Ribbon源碼

    在微服務(wù)中,對服務(wù)進(jìn)行拆分之后,必然會帶來微服務(wù)之間的通信需求,而每個微服務(wù)為了保證高可用性,又會去部署集群,那么面對一個集群微服務(wù)進(jìn)行通信的時候,如何進(jìn)行負(fù)載均衡也是必然需要考慮的問題
    2022-07-07
  • Spring為什么不推薦使用@Autowired注解詳析

    Spring為什么不推薦使用@Autowired注解詳析

    @Autowired 注解的主要功能就是完成自動注入,使用也非常簡單,但這篇文章主要給大家介紹了關(guān)于Spring為什么不推薦使用@Autowired注解的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Java 基于雪花算法生成分布式id

    Java 基于雪花算法生成分布式id

    SnowFlake 算法(雪花算法), 是Twitter開源的分布式id生成算法。其核心思想就是: 使用一個64 bit的long型的數(shù)字作為全局唯一id。本文講述Java 基于雪花算法生成分布式id的方法
    2021-06-06
  • Java中一些關(guān)鍵字的使用技巧總結(jié)

    Java中一些關(guān)鍵字的使用技巧總結(jié)

    這篇文章主要介紹了Java中一些關(guān)鍵字的使用技巧總結(jié),其中重點(diǎn)講述了this和super兩個關(guān)鍵字的用法,需要的朋友可以參考下
    2015-09-09
  • java實現(xiàn)簡單猜數(shù)字游戲

    java實現(xiàn)簡單猜數(shù)字游戲

    這篇文章主要介紹了java實現(xiàn)簡單猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12

最新評論