peterson演算法

壹頁書發表於2015-11-26


轉載自:
http://blog.csdn.net/speedme/article/details/17595821



因為P1,P2兩個程式的執行順序是隨機的,可能順序執行也可能是併發的,由圖可見,不同的執行順序,COUNT的值會不同,這是不允許的。
像這種情況,及多個程式併發訪問和操作同一資料且執行結果與訪問發生的特定順序有關,稱為競爭條件。

為了避免上述情況的發生於是就引入了臨界區概念。一個系統有n個程式,每個程式有一個程式碼段稱為臨界區。這種系統重要特徵是當一個程式在臨界區內執行,沒有其他程式被允許在臨界區內執行。

臨界區問題必須滿足三項原則:互斥,前進,有限等待

瞭解了臨界區之後,那麼如何控制兩個程式訪問一個共享的單位使用者資源而不發生訪問衝突。Peterson演算法是一個實現互斥所的併發程式設計演算法,它很好地解決了這個問題。


  1. public class Peterson implements Runnable {

  2.     private static boolean[] in = { false, false };
  3.     private static volatile int turn = -1;

  4.     public static void main(String[] args) {
  5.         new Thread(new Peterson(0), "Thread - 0").start();
  6.         new Thread(new Peterson(1), "Thread - 1").start();
  7.     }

  8.     private final int id;

  9.     public Peterson(int i) {
  10.         id = i;
  11.     }

  12.     private int other() {
  13.         return id == 0 ? 1 : 0;
  14.     }

  15.     @Override
  16.     public void run() {
  17.         in[id] = true;
  18.         turn = other();
  19.         while (in[other()] && turn == other()) {
  20.             System.out.println("[" + id + "] - Waiting...");
  21.         }
  22.         System.out.println("[" + id + "] - Working ("
  23.                 + ((!in[other()]) ? "other done" : "my turn") + ")");
  24.         in[id] = false;
  25.     }}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1847559/,如需轉載,請註明出處,否則將追究法律責任。

相關文章