1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| public class Mutex<T> {
private T criticalSection;
private boolean isTaken;
public Mutex(T criticalSection) {
this.criticalSection = criticalSection;
isTaken = false;
}
synchronized public T takeMutex() throws InterruptedException {
synchronized (this) {
if(isTaken) {
wait();
}
isTaken = true;
return criticalSection;
}
}
synchronized public void giveMutex(T criticalSection) throws IllegalArgumentException {
if(!criticalSection.equals(this.criticalSection)) {
throw new IllegalArgumentException("Le mutex rendu ne correspond pas");
}
notify();
synchronized (this) {
isTaken = false;
}
}
} |