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

詳解java中的互斥鎖信號量和多線程等待機制

 更新時間:2017年09月22日 09:19:54   作者:feifeiwendao  
這篇文章主要介紹了Java編程中的互斥鎖,信號量和多線程等待機制實例詳解,簡單介紹了互斥鎖和信號量的區(qū)別,需要的朋友可以了解下。

互斥鎖和信號量都是操作系統(tǒng)中為并發(fā)編程設(shè)計基本概念,互斥鎖和信號量的概念上的不同在于,對于同一個資源,互斥鎖只有0和1 的概念,而信號量不止于此。也就是說,信號量可以使資源同時被多個線程訪問,而互斥鎖同時只能被一個線程訪問
互斥鎖在java中的實現(xiàn)就是 ReetranLock , 在訪問一個同步資源時,它的對象需要通過方法 tryLock() 獲得這個鎖,如果失敗,返回 false,成功返回true。根據(jù)返回的信息來判斷是否要訪問這個被同步的資源??聪旅娴睦?/p>

public class ReentranLockExample {
 private static int count = 0;
 private static ReentrantLock reentrantLock = new ReentrantLock();
 static class MyThread extends Thread{
  @Override
  public void run() {
   super.run();
   try {
    while (true){
     boolean result = reentrantLock.tryLock();
     if (result){
      System.out.println(Thread.currentThread().getName() + "get the lock success and run the syn code " + count ++);
      reentrantLock.unlock();
     }else{
      System.out.println(Thread.currentThread().getName() + "get the lock failed and run the syn code " + count);
     }
     System.out.println(Thread.currentThread().getName() + "run the asyntronized code " + count);
     Thread.sleep(500);
    }
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
 public static void main(String[] args){
  MyThread thread1 = new MyThread();
  MyThread thread2 = new MyThread();
  thread1.start();
  thread2.start();
 }
}

信號量相當(dāng)于一個計數(shù)器,如果線程想要訪問某個資源,則先要獲得這個資源的信號量,并且信號量內(nèi)部的計數(shù)器減1 ,信號量內(nèi)部的計數(shù)器大于0則意味著有可以使用的資源,當(dāng)線程使用完某個資源時,必須釋放這個資源的信號量。信號量的一個作用就是可以實現(xiàn)指定個線程去同事訪問某個資源。只需要在初始化 。

信號量在 Java中的實現(xiàn)是 Semaphore  ,其在初始化時傳入一個整型數(shù), 用來指定同步資源最大的并發(fā)訪問量

public class SemaphoreExample {
 private static Semaphore semaphore = new Semaphore(2);
 private String lock = "lock";
 private static int count = 0;
 static class MyThread extends Thread {
  @Override
  public void run() {
   super.run();
   try {
    while (true) {
     semaphore.acquire();
     Thread.sleep(500);
     System.out.println(Thread.currentThread().getName() + "get the lock success and run the syn code " + count++);
     semaphore.release();
     Thread.sleep(500);
    }
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
 public static void main(String[] args){
  MyThread thread1 = new MyThread();
  MyThread thread2 = new MyThread();
  MyThread thread3 = new MyThread();
  thread1.start();
  thread2.start();
  thread3.start();
 }
}

 CountDownLatch 實現(xiàn)一個等待機制,在諸如 等待與會者到達后,開始會議的使用中。ConutDownLatch 在初始化中一個計數(shù)器,用來指定需要等待的個數(shù)。在并發(fā)編程中,所解決的需求就是,等待所有的線程到達某個點后。才開始進行下一步,有點類似于開會,只有當(dāng)所有的與會人員都到齊后,會議才能開始

public class CountDownLatchExample {
 private static CountDownLatch mCountDownLatch = new CountDownLatch(3);
 static class MyThread extends Thread {
  int awaitTime;
  public MyThread(int i) {
   this.awaitTime = i;
  }
  @Override
  public void run() {
   super.run();
   try {
    while (true) {
     Thread.sleep(awaitTime);
     System.out.println(Thread.currentThread().getName() + "arrived " );
     mCountDownLatch.countDown();
     mCountDownLatch.await(); //可以指定等待時間
     System.out.println(Thread.currentThread().getName() + "start meeting " );
    }
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
 public static void main(String[] args){
  MyThread thread1 = new MyThread(500);
  MyThread thread2 = new MyThread(1000);
  MyThread thread3 = new MyThread(2000);
  thread1.start();
  thread2.start();
  thread3.start();
 }
}

總結(jié)

以上就是本文有關(guān)Java編程中的互斥鎖,信號量和多線程等待機制實例詳解的全部內(nèi)容,希望對大家有所幫助。

有興趣的朋友可以了解:Java多線程賣票實例、Java多線程并發(fā)編程(互斥鎖Reentrant Lock)等。

相關(guān)文章

  • 一文搞懂Java中的注解和反射

    一文搞懂Java中的注解和反射

    這篇文章主要給大家介紹了關(guān)于Java中注解和反射的原理及使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Java JSqlParser解析,修改和生成SQL語句的實用技巧

    Java JSqlParser解析,修改和生成SQL語句的實用技巧

    JSQLParser 是一個強大的開源 Java 庫,用于解析 SQL 并提供語法樹操作功能,本文將詳細介紹如何使用 JSQLParser,并提供常見使用場景的代碼示例,希望對大家有所幫助
    2025-04-04
  • SpringSecurity自定義登錄成功處理

    SpringSecurity自定義登錄成功處理

    這篇文章主要為大家詳細介紹了SpringSecurity自定義登錄成功處理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Java游戲開發(fā)拼圖游戲經(jīng)典版

    Java游戲開發(fā)拼圖游戲經(jīng)典版

    這篇文章主要介紹了Java游戲開發(fā)拼圖游戲經(jīng)典版,對這方面感興趣的同學(xué)可以跟著教程試下
    2021-01-01
  • JAVA中調(diào)用C語言函數(shù)的實現(xiàn)方式

    JAVA中調(diào)用C語言函數(shù)的實現(xiàn)方式

    這篇文章主要介紹了JAVA中調(diào)用C語言函數(shù)的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 手把手教你寫一個SpringBoot+gRPC服務(wù)

    手把手教你寫一個SpringBoot+gRPC服務(wù)

    本文將在本地環(huán)境下搭建gRPC客戶端和服務(wù)端,并成功建立通訊發(fā)送消息的方式,從而幫助大家深入了解gRPC在Spring Boot項目中的應(yīng)用,有需要的小伙伴可以參考下
    2023-12-12
  • java?String到底有多長?String超出長度該如何解決

    java?String到底有多長?String超出長度該如何解決

    在Java中,由于字符串常量池的存在,String常量長度限制取決于String常量在常量池中的存儲大小,下面這篇文章主要給大家介紹了關(guān)于java?String到底有多長?String超出長度該如何解決的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • IntelliJ IDEA中代碼一鍵生成方法

    IntelliJ IDEA中代碼一鍵生成方法

    EasyCode 是基于 IntelliJ IDEA 開發(fā)的代碼生成插件,支持自定義任意模板(Java,html,js,xml),這篇文章主要介紹了IntelliJ IDEA中代碼一鍵生成方法,需要的朋友可以參考下
    2020-02-02
  • Java?try?catch語句異常處理詳解

    Java?try?catch語句異常處理詳解

    這篇文章主要給大家介紹了關(guān)于Java?try?catch語句異常處理的相關(guān)資料,Java中的try-catch用于捕獲和處理異常,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • MyBatis-Plus?中?typeHandler?的使用實例詳解

    MyBatis-Plus?中?typeHandler?的使用實例詳解

    本文介紹了在MyBatis-Plus中如何使用typeHandler處理json格式字段和自定義typeHandler,通過使用JacksonTypeHandler,可以簡單實現(xiàn)將實體類字段轉(zhuǎn)換為json格式存儲,感興趣的朋友跟隨小編一起看看吧
    2024-10-10

最新評論

永仁县| 黄龙县| 隆安县| 台北县| 和龙市| 惠来县| 广东省| 迁安市| 玉树县| 华池县| 保德县| 赞皇县| 乐至县| 东兴市| 滁州市| 赣榆县| 广河县| 慈利县| 绩溪县| 潜山县| 通河县| 中超| 交口县| 青田县| 元江| 独山县| 建瓯市| 房产| 涡阳县| 合作市| 清徐县| 钟祥市| 彝良县| 利津县| 和顺县| 海林市| 来宾市| 昭平县| 南投县| 杨浦区| 滦平县|