91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-09-08 10:49:53 來源:腳本之家 閱讀:134 作者:feifeiwendao 欄目:編程語言

互斥鎖和信號量都是操作系統中為并發編程設計基本概念,互斥鎖和信號量的概念上的不同在于,對于同一個資源,互斥鎖只有0和1 的概念,而信號量不止于此。也就是說,信號量可以使資源同時被多個線程訪問,而互斥鎖同時只能被一個線程訪問
互斥鎖在java中的實現就是 ReetranLock , 在訪問一個同步資源時,它的對象需要通過方法 tryLock() 獲得這個鎖,如果失敗,返回 false,成功返回true。根據返回的信息來判斷是否要訪問這個被同步的資源。看下面的例子

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();
 }
}

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

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

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 實現一個等待機制,在諸如 等待與會者到達后,開始會議的使用中。ConutDownLatch 在初始化中一個計數器,用來指定需要等待的個數。在并發編程中,所解決的需求就是,等待所有的線程到達某個點后。才開始進行下一步,有點類似于開會,只有當所有的與會人員都到齊后,會議才能開始

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();
 }
}

總結

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蚌埠市| 新龙县| 曲阜市| 新建县| 衡东县| 福建省| 磐石市| 宜川县| 象州县| 陈巴尔虎旗| 阳泉市| 万盛区| 贡山| 新津县| 农安县| 独山县| 正镶白旗| 仁化县| 砚山县| 新竹市| 新乐市| 桐柏县| 吉安县| 东阳市| 仙居县| 侯马市| 壶关县| 清河县| 房产| 弥勒县| 武山县| 大足县| 汤原县| 奉化市| 北川| 云安县| 通州市| 海晏县| 昭平县| 于田县| 郎溪县|