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

使用java實(shí)現(xiàn)銀行家算法

 更新時(shí)間:2019年12月26日 11:37:44   作者:demo易  
這篇文章主要為大家詳細(xì)介紹了如何使用java實(shí)現(xiàn)銀行家算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

銀行家算法核心

先尋找滿足系統(tǒng)當(dāng)前剩余的資源量(avaliable )>=進(jìn)程運(yùn)行所需的資源數(shù)的進(jìn)程(need),再假設(shè)這個(gè)進(jìn)程安全校驗(yàn)是成功的,當(dāng)這個(gè)進(jìn)程運(yùn)行完畢后,釋放資源后,現(xiàn)在系統(tǒng)當(dāng)前剩余的資源(avaliable)=avaliable+該線程之前已分配的資源(allocation) ,將該節(jié)點(diǎn)進(jìn)程設(shè)為處理時(shí)忽略進(jìn)程,再以上條件為前提進(jìn)行安全校驗(yàn)。
安全校驗(yàn):一個(gè)進(jìn)程獲得資源后,運(yùn)行完畢,釋放之前分配的資源,其他的線程可以繼續(xù)運(yùn)行,而不會(huì)造成死鎖。
這樣就會(huì)產(chǎn)生回溯。

滿足條件:是否存在一個(gè)進(jìn)程運(yùn)行所需的資源數(shù)<=當(dāng)前系統(tǒng)剩余的資源數(shù)。

查找操作:先判斷回溯的步長(zhǎng)(層數(shù))是否等于節(jié)點(diǎn)的個(gè)數(shù),如果等于說明已經(jīng)找到了正確路徑,返回真給上一層,如果不滿足,則看一下此層是否存在滿足條件的節(jié)點(diǎn),如果存在,這一該節(jié)點(diǎn)為回溯點(diǎn)開始查找操作。如果都不存在,說明上一層的回溯點(diǎn)不是我們要找的節(jié)點(diǎn),返回假給上一層,并回溯回到上一層節(jié)點(diǎn),將忽略標(biāo)記清楚,換另一個(gè)滿足條件的節(jié)點(diǎn)繼續(xù)在進(jìn)行查找操作。

先以一個(gè)滿足條件的節(jié)點(diǎn)進(jìn)行忽略標(biāo)記(下一次查找時(shí)可忽略此節(jié)點(diǎn)),回溯的步長(zhǎng)加一,再進(jìn)行查找操作(下一層)。

import java.util.Arrays;

public class BanksTest {
  // 用于存儲(chǔ)預(yù)操作后的資源變化
  static int[] new_Avaliable = null;
  // 用于存儲(chǔ)預(yù)操作的完成度
  static boolean[] new_finish = null;
  // 用于保存最終的進(jìn)程執(zhí)行順序,初始化為非法進(jìn)程-1
  static int right[] = { -1, -1, -1, -1, -1 };

  public static void main(String[] args) {
    // 最大需求量
    int[][] max = { { 7, 5, 3 }, { 3, 2, 2 }, { 9, 0, 2 }, { 2, 2, 2 }, { 4, 3, 3 } };
    // 當(dāng)前系統(tǒng)可用資源量
    int[] avaliable = { 3, 3, 2 };
    // 每個(gè)進(jìn)程運(yùn)行還需資源量
    int[][] need = new int[5][3];
    // 每個(gè)進(jìn)程已分配的資源量
    int[][] allocation = { { 0, 1, 0 }, { 2, 0, 0 }, { 3, 0, 2 }, { 2, 1, 1 }, { 0, 0, 2 } };
    // 用于第一深度預(yù)判的初始化
    boolean finish[] = { false, false, false, false, false };
    // 獲取每個(gè)進(jìn)程運(yùn)行時(shí)還需的資源量
    for (int i = 0; i < max.length; i++) {
      for (int j = 0; j < max[i].length; j++) {
        need[i][j] = max[i][j] - allocation [i][j];
      }
    }
    // 創(chuàng)建遞歸深度
    int deep = 0;
    // 調(diào)用回溯遞歸算法
    deepCheck(avaliable, allocation, need, finish, deep, right);
    int i = 0;
    // 查看最終的安全序列的值,看是否存在初始的非法進(jìn)程,如果存在,則說明該案例不存在安全的進(jìn)程執(zhí)行順序
    for (; i < right.length; i++) {
      if (right[i] == -1) {
        break;
      }
    }
    if (i < right.length) {
      System.out.println("該案例不存在安全的進(jìn)程執(zhí)行順序");
      return;
    }
    // 打印安全的執(zhí)行順序
    for (int j = 0; j < right.length; j++) {
      System.out.println(right[j]);

    }

  }

  // 完全遞歸回溯查找安全順序
  public static boolean deepCheck(int[] avaliable, int[][] allocation, int[][] need, boolean finish[], int deep,
      int right[]) {
    int j = 0;
    boolean flog = false;
    // 如果深度為進(jìn)程的個(gè)數(shù)數(shù)說明已經(jīng)查找到頭了,說明上一深度的進(jìn)程是安全節(jié)點(diǎn)。因?yàn)樯弦簧疃鹊倪M(jìn)程滿足了當(dāng)前資源數(shù)大于或等于該進(jìn)程運(yùn)行所需的資源數(shù),且為安全序列中最后一個(gè)節(jié)點(diǎn)。
    if (deep == need.length) {
      return true;
    }
    // 遍歷所有節(jié)點(diǎn)進(jìn)程開始查找,直到找到安全校驗(yàn)成功的的節(jié)點(diǎn)進(jìn)程
    for (int i = 0; i < need.length; i++) {
      // 對(duì)于未被標(biāo)記的進(jìn)行校驗(yàn),已被標(biāo)記的為已被列為安全節(jié)點(diǎn)所以無需再進(jìn)行校驗(yàn)
      if (!finish[i]) {
        // 判斷當(dāng)前的節(jié)點(diǎn)進(jìn)程的剩余的資源量,是否滿足運(yùn)行所需的資源量
        for (j = 0; j < avaliable.length; j++) {
          // 不滿足
          if (need[i][j] > avaliable[j]) {
            break;
          }
        }
        // 不滿足則處理下一個(gè)節(jié)點(diǎn)進(jìn)程
        if (j < avaliable.length) {
          continue;
        } else {
          // 滿足情況
          // 復(fù)制會(huì)被修改的前提條件,已便于當(dāng)前進(jìn)程校驗(yàn)不成功時(shí),可以恢復(fù)前提條件,開始下一個(gè)節(jié)點(diǎn)進(jìn)程的校驗(yàn)
          new_Avaliable = Arrays.copyOf(avaliable, avaliable.length);
          new_finish = Arrays.copyOf(finish, finish.length);
          // 假設(shè)當(dāng)前節(jié)點(diǎn)進(jìn)程是可以校驗(yàn)成功的節(jié)點(diǎn)進(jìn)程,修改該進(jìn)程運(yùn)行完畢后釋放之前分配的進(jìn)程。
          for (j = 0; j < new_Avaliable.length; j++) {
            new_Avaliable[j] += allocation[i][j];
          }
          // 假設(shè)標(biāo)記當(dāng)前為校驗(yàn)成功的安全節(jié)點(diǎn)進(jìn)程,下一深度查找時(shí)會(huì)忽略此進(jìn)程。
          new_finish[i] = true;
          // 增加深度
          deep++;
          // 以上假設(shè)為前提,進(jìn)行下一深度的安全校驗(yàn)判斷其他所剩余進(jìn)程是否可以繼續(xù)運(yùn)行,而不造成死鎖。
          flog = deepCheck(new_Avaliable, allocation, need, new_finish, deep, right);
          // 如果進(jìn)行安全校驗(yàn)后為真,說明當(dāng)前進(jìn)程是我們要找的進(jìn)程
          if (flog) {
            // 保存到最終進(jìn)程執(zhí)行序列的數(shù)組中
            right[--deep] = i;
            break;
          }

        }

      }

    }
    // 安全校驗(yàn)成功
    if (flog) {
      return true;
    } else {
      // 安全校驗(yàn)失敗
      // 清楚之前的假設(shè)標(biāo)記
      new_finish[right[--deep]] = false;
      return false;
    }

  }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java日期時(shí)間類(Date、DateFormat、Calendar)解析

    Java日期時(shí)間類(Date、DateFormat、Calendar)解析

    這篇文章主要介紹了Java日期時(shí)間類(Date、DateFormat、Calendar)解析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • java并發(fā)學(xué)習(xí)之BlockingQueue實(shí)現(xiàn)生產(chǎn)者消費(fèi)者詳解

    java并發(fā)學(xué)習(xí)之BlockingQueue實(shí)現(xiàn)生產(chǎn)者消費(fèi)者詳解

    這篇文章主要介紹了java并發(fā)學(xué)習(xí)之BlockingQueue實(shí)現(xiàn)生產(chǎn)者消費(fèi)者詳解,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • SpringBoot集成Jasypt敏感信息加密的操作方法

    SpringBoot集成Jasypt敏感信息加密的操作方法

    這篇文章主要介紹了SpringBoot集成Jasypt加密敏感信息,包括敏感信息加密的作用,項(xiàng)目集成Jasypt方式詳解,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • IDEA 2021.1 操作SVN 最新超詳細(xì)教程(圖文)

    IDEA 2021.1 操作SVN 最新超詳細(xì)教程(圖文)

    本教程將通過idea從svn服務(wù)器中的任意一個(gè)分支檢出代碼(本文采用branches),然后再idea中創(chuàng)建新的分支、提交代碼、拉取代碼、合并分支等操作進(jìn)行一一記錄,暫不包含代碼合并,對(duì)idea2021.1操作svn相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)下吧
    2021-05-05
  • Java的DelayQueue延遲隊(duì)列簡(jiǎn)單使用代碼實(shí)例

    Java的DelayQueue延遲隊(duì)列簡(jiǎn)單使用代碼實(shí)例

    這篇文章主要介紹了Java的DelayQueue延遲隊(duì)列簡(jiǎn)單使用代碼實(shí)例,DelayQueue是一個(gè)延遲隊(duì)列,插入隊(duì)列的數(shù)據(jù)只有達(dá)到設(shè)置的延遲時(shí)間時(shí)才能被取出,否則線程會(huì)被阻塞,插入隊(duì)列的對(duì)象必須實(shí)現(xiàn)Delayed接口,需要的朋友可以參考下
    2023-12-12
  • 淺談Arrays.asList()方法的使用

    淺談Arrays.asList()方法的使用

    本文主要介紹了Arrays.asList()方法的使用。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • Jmeter參數(shù)化實(shí)現(xiàn)原理及過程解析

    Jmeter參數(shù)化實(shí)現(xiàn)原理及過程解析

    這篇文章主要介紹了Jmeter參數(shù)化實(shí)現(xiàn)原理及過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • FastJson實(shí)現(xiàn)駝峰下劃線相互轉(zhuǎn)換方法詳解

    FastJson實(shí)現(xiàn)駝峰下劃線相互轉(zhuǎn)換方法詳解

    這篇文章主要介紹了使用FastJson進(jìn)行駝峰下劃線相互轉(zhuǎn)換寫法及誤區(qū),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-01-01
  • Redis監(jiān)聽過期的key實(shí)現(xiàn)流程詳解

    Redis監(jiān)聽過期的key實(shí)現(xiàn)流程詳解

    本文主要介紹了Redis監(jiān)聽key的過期時(shí)間,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • MyBatis注解式開發(fā)映射語句詳解

    MyBatis注解式開發(fā)映射語句詳解

    這幾年來注解開發(fā)越來越流行,Mybatis也可以使用注解開發(fā)方式,這樣我們就可以減少編寫Mapper映射文件了。我們先圍繞一些基本的CRUD來學(xué)習(xí),再學(xué)習(xí)復(fù)雜映射多表操作
    2023-02-02

最新評(píng)論