package elte.java2_utikalauz5.rmi; /** Egy egyszeru kolcsonos kizarasi objektum (mutex) implementacioja. @link.forrásfájl {@docRoot}/../data/rmi/src Mutex.java @link.letöltés {@docRoot}/../data/rmi RMIMutex.jar @since Java 2 Útikalauz programozóknak 1.3 */ public class Mutex { private boolean foglalt = false; // A mutex allapota // A metodus varakozik, amig a mutexet fel nem szabaditjak // A hivo szal legyen a (this) objektum lockjanaka tulajdonosa! private void varakozas() throws InterruptedException { if (foglalt) { // Ha foglalt a mutex, akkor varakozunk a szabadraallitasara while (true) { this.wait(); // Varunk, amig valaki jelzi, hogy felszabaditotta // (addig elengedjuk a zarat) if (!foglalt) { break; // Ha a jelzes azert jott, mert szabad a mutex, akkor kilepunk } } } // A mutex szabad } // A metodus varakozik, amig a mutexet fel nem szabaditjak, vagy a parameterben // megadott ido (ezredmp-ben) le nem telik // A hivo szal legyen a (this) objektum lockjanaka tulajdonosa! private void korlatozottvarakozas(long ms) throws InterruptedException, Timeout { if (foglalt) { long kezdet = System.currentTimeMillis(); long ebredes = kezdet; while (true) { this.wait(ms - (ebredes - kezdet)); // amig var, elengedi a zarat ebredes = System.currentTimeMillis(); if (ms - (ebredes - kezdet) <= 0) { throw new Timeout(); } if (!foglalt) { break; } } } // A mutex szabad } // Mutex muvelet (ld. RMIMutex.java interfesz leirasat) // Mivel synchronized, ezert egyidejuleg legfeljebb egy kliens // hivhatja az alabbi metodusok barmelyiket. public synchronized void Lefoglal() throws InterruptedException { varakozas(); foglalt=true; } // Mutex muvelet (ld. RMIMutex.java interfesz leirasat) // Mivel synchronized, ezert egyidejuleg legfeljebb egy kliens // hivhatja az alabbi (ill. az elobbi egyetlen) metodusok barmelyiket. public synchronized void Korlatozottlefoglal(long ms) throws InterruptedException, Timeout { korlatozottvarakozas(ms); foglalt=true; // Ha ide jutott, akkor nem dobott kivetelt } // Mutex muvelet (ld. RMIMutex.java interfesz leirasat) // Mivel synchronized, ezert egyidejuleg legfeljebb egy kliens // hivhatja ezen metodusok barmelyiket. public synchronized void Felszabadit() throws InterruptedException { foglalt=false; this.notify(); // Jelezzuk, hogy felszabaditottuk a mutexet } }