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

java并發(fā)編程專題(六)----淺析(JUC)Semaphore

 更新時(shí)間:2020年07月01日 10:59:11   作者:rickiyang  
這篇文章主要介紹了java JUC)Semaphore的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下

半路開(kāi)始看的朋友可以回顧一下前幾篇

java并發(fā)編程專題(一)----線程基礎(chǔ)知識(shí)

java并發(fā)編程專題(二)----如何創(chuàng)建并運(yùn)行java線程

java并發(fā)編程專題(三)----詳解線程的同步

java并發(fā)編程專題(四)----淺談(JUC)Lock鎖

java并發(fā)編程專題(五)----詳解(JUC)ReentrantLock

Semaphore,從字面意義上我們知道他是信號(hào)量的意思。在java中,一個(gè)計(jì)數(shù)信號(hào)量維護(hù)了一個(gè)許可集。Semaphore 只對(duì)可用許可的號(hào)碼進(jìn)行計(jì)數(shù),并采取相應(yīng)的行動(dòng)。拿到信號(hào)量的線程可以進(jìn)入代碼,否則就等待。通過(guò)acquire()和release()獲取和釋放訪問(wèn)許可。

信號(hào)量Semaphore是一個(gè)控制訪問(wèn)多個(gè)共享資源的計(jì)數(shù)器,它本質(zhì)上是一個(gè)“共享鎖”。

Java并發(fā)提供了兩種加鎖模式:共享鎖和獨(dú)占鎖。前面介紹的ReentrantLock就是獨(dú)占鎖。對(duì)于獨(dú)占鎖而言,它每次只能有一個(gè)線程持有,而共享鎖則不同,它允許多個(gè)線程并行持有鎖,并發(fā)訪問(wèn)共享資源。

獨(dú)占鎖它所采用的是一種悲觀的加鎖策略, 對(duì)于寫而言為了避免沖突獨(dú)占是必須的,但是對(duì)于讀就沒(méi)有必要了,因?yàn)樗粫?huì)影響數(shù)據(jù)的一致性。如果某個(gè)只讀線程獲取獨(dú)占鎖,則其他讀線程都只能等待了,這種情況下就限制了不必要的并發(fā)性,降低了吞吐量。而共享鎖則不同,它放寬了加鎖的條件,采用了樂(lè)觀鎖機(jī)制,它是允許多個(gè)讀線程同時(shí)訪問(wèn)同一個(gè)共享資源的。

舉一個(gè)生活中的例子,有一條單行道路口有一紅綠燈在正常的綠燈時(shí)間內(nèi)如果騎車速度都很平均只能過(guò)去20輛車,這就意味著排在前面的20輛肯定能過(guò)去紅綠燈,后面的就只能等下一個(gè)綠燈了。但是如果這個(gè)時(shí)候有車不想過(guò)去這個(gè)路口它駛向了邊上別的路,那么后面的車就有機(jī)會(huì)。下面我們來(lái)看一個(gè)簡(jiǎn)單的例子:

public class TestSemaphore {
 public static void main(String[] args) {
  final Semaphore semaphore = new Semaphore(5);
  ExecutorService executorService = Executors.newCachedThreadPool();
  for(int i = 0;i<10;i++){
   int j = 0;
   executorService.submit(new A("car"+(j++),semaphore),"Thread"+(j++));
   //new Thread(new A("car"+(j++),semaphore),"Thread"+(j++)).start();
   if(i == 5){
    try {
     Thread.sleep(1000);
     System.out.println("最后還有"+semaphore.availablePermits()+"個(gè)許可可用");
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
  }

  System.out.println("最后還有"+semaphore.availablePermits()+"個(gè)許可可用");
 }

 }
 class A implements Runnable{
  String carName;
  private Semaphore semaphore;

  public A(String carName, Semaphore semaphore){
   this.carName = carName;
   this.semaphore = semaphore;
  }

  public void getWay(){
   System.out.println("this car is get the way" + Thread.currentThread().getName());
  }

  public void run() {
   try {
    if(semaphore.availablePermits() > 0){
     semaphore.acquire();
     getWay();
     semaphore.release();
    }else{
     System.out.println("請(qǐng)等待========");
    }
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }

以上就是java并發(fā)編程專題(六)----淺析(JUC)Semaphore的詳細(xì)內(nèi)容,更多關(guān)于JAVA Semaphore的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JDK  keytool證書(shū)工具功能代碼解析

    JDK keytool證書(shū)工具功能代碼解析

    這篇文章主要介紹了JDK keytool證書(shū)工具功能代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 使用Spring Security控制會(huì)話的方法

    使用Spring Security控制會(huì)話的方法

    在本文中,我們將說(shuō)明Spring Security如何允許我們控制HTTP會(huì)話。這篇文章主要介紹了使用Spring Security控制會(huì)話 ,需要的朋友可以參考下
    2019-05-05
  • Java中Stringbuild,Date和Calendar類的用法詳解

    Java中Stringbuild,Date和Calendar類的用法詳解

    這篇文章主要為大家詳細(xì)介紹了Java中Stringbuild、Date和Calendar類的用法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-04-04
  • 如何自定義MyBatis攔截器更改表名

    如何自定義MyBatis攔截器更改表名

    自定義MyBatis攔截器可以在方法執(zhí)行前后插入自己的邏輯,這非常有利于擴(kuò)展和定制 MyBatis 的功能,本篇文章實(shí)現(xiàn)自定義一個(gè)攔截器去改變要插入或者查詢的數(shù)據(jù)源?,需要的朋友可以參考下
    2023-10-10
  • Spring MVC 中 AJAX請(qǐng)求并返回JSON的示例

    Spring MVC 中 AJAX請(qǐng)求并返回JSON的示例

    本篇文章主要介紹了Spring MVC 中 AJAX請(qǐng)求并返回JSON,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-01-01
  • SpringBoot整合redis+Aop防止重復(fù)提交的實(shí)現(xiàn)

    SpringBoot整合redis+Aop防止重復(fù)提交的實(shí)現(xiàn)

    Spring Boot通過(guò)AOP可以實(shí)現(xiàn)防止表單重復(fù)提交,本文主要介紹了SpringBoot整合redis+Aop防止重復(fù)提交的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 淺析Java?NIO?直接緩沖區(qū)和非直接緩沖區(qū)

    淺析Java?NIO?直接緩沖區(qū)和非直接緩沖區(qū)

    本篇文章主要為大家介紹了Java?NIO?中直接緩沖區(qū)和非直接緩沖區(qū)的定義以及使用流程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • Java入門基礎(chǔ)之抽象類與接口

    Java入門基礎(chǔ)之抽象類與接口

    對(duì)于面向?qū)ο缶幊虂?lái)說(shuō),抽象是它的一大特征之一,在 Java 中可以通過(guò)兩種形式來(lái)體現(xiàn)OOP的抽象:接口和抽象類,下面這篇文章主要給大家介紹了關(guān)于Java入門基礎(chǔ)之抽象類與接口的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • java打印指定年月的日歷

    java打印指定年月的日歷

    這篇文章主要為大家詳細(xì)介紹了Java如何打印指定年月的日歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Spring boot @ModelAttribute標(biāo)注的實(shí)現(xiàn)

    Spring boot @ModelAttribute標(biāo)注的實(shí)現(xiàn)

    這篇文章主要介紹了Spring boot @ModelAttribute標(biāo)注的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01

最新評(píng)論