class Bakery implements Lock {
int N;
boolean[] choosing; // inside doorway
int[] number;
public Bakery(int numProc) {
N = numProc;
choosing = new boolean[N];
number = new int[N];
for (int j = 0; j < N; j++) {
choosing[j] = false;
number[j] = 0;
}
}
public void requestCS(int i) {
// step 1: doorway: choose a number
choosing[i] = true;
for (int j = 0; j < N; j++)
if (number[j] > number[i])
number[i] = number[j];
number[i]++;
choosing[i] = false;
// step 2: check if my number is the smallest
for (int j = 0; j < N; j++) {
while (choosing[j]) ; // process j in doorway
while ((number[j] != 0) &&
((number[j] < number[i]) ||
((number[j] == number[i]) && j < i)))
; // busy wait
}
}
public void releaseCS(int i) { // exit protocol
number[i] = 0;
}
}