最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java并發(fā)編程之Semaphore詳解

 更新時(shí)間:2023年12月31日 08:13:54   作者:_Romeo  
這篇文章主要介紹了Java并發(fā)編程之concurrent包中的Semaphore詳解,信號量Semaphore一般用來表示可用資源的個(gè)數(shù),相當(dāng)于一個(gè)計(jì)數(shù)器,可類比生活中停車場牌子上面顯示的停車場剩余車位數(shù)量,需要的朋友可以參考下

概念

  • 信號量Semaphore一般用來表示可用資源的個(gè)數(shù),相當(dāng)于一個(gè)計(jì)數(shù)器,可類比生活中停車場牌子上面顯示的停車場剩余車位數(shù)量。
  • 當(dāng)有車開進(jìn)去的時(shí)候, 就相當(dāng)于申請一個(gè)可用資源,可用車位就 -1 (這個(gè)稱為信號量的 P 操作) 當(dāng)有車開出來的時(shí)候, 就相當(dāng)于釋放一個(gè)可用資源, 可用車位就 +1 (這個(gè)稱為信號量的 V 操作)
  • 如果計(jì)數(shù)器的值已經(jīng)為 0 了,還嘗試申請資源,就會阻塞等待,直到有其他線程釋放資源(計(jì)數(shù)器的值是大于等于0的)

默認(rèn)構(gòu)造方法

 public Semaphore(int permits){}

信號量:permits

重要方法

//申請資源,計(jì)數(shù)器值=0,則阻塞
public void acquire() throws InterruptedException {}
//釋放資源
public void release() {}

1、類Semaphore的構(gòu)造函數(shù)permits 是許可的意思,代表同一時(shí)間,最多允許permits執(zhí)行acquire() 和release() 之間的代碼。

例如:

Semaphore semaphore = new Semaphore(1);
  • 2、方法acquire(n) 的功能是每調(diào)用1次此方法,就消耗掉n個(gè)許可。
  • 3、方法release(n) 的功能是每調(diào)用1次此方法,就動態(tài)添加n個(gè)許可。
  • 4、方法acquireUnnterruptibly()作用是是等待進(jìn)入acquire() 方法的線程不允許被中斷。
  • 5、方法availablePermits() 返回Semaphore對象中當(dāng)前可以用的許可數(shù)。
  • 6、方法drainPermits() 獲取并返回所有的許可個(gè)數(shù),并且將可用的許可重置為0
  • 7、方法 getQueueLength() 的作用是取得等待的許可的線程個(gè)數(shù)
  • 8、方法 hasQueueThreads() 的作用是判斷有沒有線程在等待這個(gè)許可
  • 9、公平和非公平信號量:有些時(shí)候獲取許可的的順序與線程啟動的順序有關(guān),這是的信號量就要分為公平和非公平的。所謂的公平信號量是獲得鎖的順序與線程啟動的順序有關(guān),但不代表100%獲得信號量,僅僅是在概率上能保證,而非公平信號量就是無關(guān)的。

例如:

Semaphore semaphore = new Semaphore(1,false);
  • False:表示非公平信號量,即線程啟動的順序與調(diào)用semaphore.acquire() 的順序無關(guān),也就是線程先啟動了并不代表先獲得 許可。
  • True:公平信號量,即線程啟動的順序與調(diào)用semaphore.acquire() 的順序有關(guān),也就是先啟動的線程優(yōu)先獲得許可。
  • 10、方法tryAcquire() 的作用是嘗試獲取1個(gè)許可。如果獲取不到則返回false,通常與if語句結(jié)合使用,其具有無阻塞的特點(diǎn)。無阻塞的特點(diǎn)可以使不至于在同步處于一直持續(xù)等待的狀態(tài)。
  • 11、方法tryAcquire(n) 的作用是嘗試獲取n個(gè)許可,如果獲取不到則返回false
  • 12、方法tryAcquire(long timeout,TimeUnit unit)的作用是在指定的時(shí)間內(nèi)嘗試獲取1個(gè)許可,如果獲取不到則返回false
  • 13、方法tryAcquire(int permits,long timeout,TimeUnit unit) 的作用是在指定的時(shí)間內(nèi)嘗試獲取n 個(gè)許可,如果獲取不到則返回false
  • 14、多進(jìn)路-多處理-多出路:允許多個(gè)線程同時(shí)處理任務(wù)

測試使用

import java.util.concurrent.Semaphore;
public class Test {
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(3);
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println("準(zhǔn)備申請資源");
                    semaphore.acquire();
                    System.out.println("申請資源成功");
                    // 申請到資源之后休眠1秒
                    Thread.sleep(1000);
                    semaphore.release();
                    // 釋放資源
                    System.out.println("釋放資源完畢");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        // 創(chuàng)建15個(gè)線程,讓這 15 個(gè)線程來分別去嘗試申請資源
        for (int i = 0; i < 15; i++) {
            Thread t = new Thread(runnable);
            t.start();
        }
    }
}

運(yùn)行結(jié)果如下:

在這里插入圖片描述

可以看到,由于資源數(shù)為3,所以前3個(gè)線程申請資源后很容易成功,而之后的線程就沒有資源可以申請了,只能等到前3個(gè)線程把資源釋放出來后再申請

信號量相當(dāng)于是鎖的升級版本,鎖只能控制一個(gè)資源的有無,而信號量可以控制很多個(gè)資源的有無

到此這篇關(guān)于Java并發(fā)編程之concurrent包中的Semaphore詳解的文章就介紹到這了,更多相關(guān)Java的Semaphore信號量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

武汉市| 安多县| 阳朔县| 高唐县| 克拉玛依市| 金塔县| 平原县| 静乐县| 闽侯县| 沛县| 东至县| 平湖市| 长海县| 图片| 淳化县| 墨竹工卡县| 枣庄市| 金平| 石柱| 沽源县| 普宁市| 临高县| 洞口县| 古丈县| 东乡县| 舟曲县| 云南省| 信宜市| 高清| 遵义市| 娄烦县| 赤壁市| 博湖县| 冷水江市| 库尔勒市| 河南省| 南宫市| 赣州市| 屏山县| 乌兰县| 泰宁县|