Untitled
unknown
plain_text
6 months ago
1.5 kB
5
Indexable
public class SafeAlley extends Alley { private int up, down; private final Semaphore alleySem, downSem, upSem; protected SafeAlley() { up = 0; down = 0; alleySem = new Semaphore(1); downSem = new Semaphore(1); upSem = new Semaphore(1); } /* Block until car no. may enter alley */ public void enter(int no) throws InterruptedException { if (no < 5) { // down-going cars downSem.P(); if (down == 0) { alleySem.P(); // First down-going car acquires alley } down++; downSem.V(); } else { // up-going cars upSem.P(); if (up == 0) { alleySem.P(); // First up-going car acquires alley } up++; upSem.V(); } } /* Register that car no. has left the alley */ public void leave(int no) throws InterruptedException { if (no < 5) { // down-going cars downSem.P(); down--; if (down == 0) { alleySem.V(); // Last down-going car releases alley } downSem.V(); } else { // up-going cars upSem.P(); up--; if (up == 0) { alleySem.V(); // Last up-going car releases alley } upSem.V(); } } }
Editor is loading...
Leave a Comment