jtulach@71: /* jtulach@71: * To change this template, choose Tools | Templates jtulach@71: * and open the template in the editor. jtulach@71: */ jtulach@71: jtulach@330: package org.apidesign.privileged.api; jtulach@71: jtulach@71: import java.util.concurrent.locks.Lock; jtulach@71: import java.util.concurrent.locks.ReentrantLock; jtulach@71: jtulach@71: /** jtulach@71: * jtulach@71: * @author Jaroslav Tulach jtulach@71: */ jtulach@330: // BEGIN: mutex.api jtulach@71: public class Mutex { jtulach@71: Lock lock = new ReentrantLock(); jtulach@71: jtulach@71: public Mutex() { jtulach@71: } jtulach@71: jtulach@71: public void readAccess(Runnable r) { jtulach@71: try { jtulach@71: lock.lock(); jtulach@71: r.run(); jtulach@71: } finally { jtulach@71: lock.unlock(); jtulach@71: } jtulach@71: } jtulach@330: // FINISH: mutex.api jtulach@71: jtulach@330: // BEGIN: mutex.privileged.api jtulach@71: public Mutex(Privileged privileged) { jtulach@71: if (privileged.mutex != null) { jtulach@71: throw new IllegalStateException(); jtulach@71: } jtulach@71: privileged.mutex = this; jtulach@71: } jtulach@71: jtulach@71: public static final class Privileged { jtulach@71: private Mutex mutex; jtulach@71: jtulach@71: public void enterReadAccess() { jtulach@71: mutex.lock.lock(); jtulach@71: } jtulach@71: jtulach@71: public void exitReadAccess() { jtulach@71: mutex.lock.unlock(); jtulach@71: } jtulach@71: } jtulach@330: // END: mutex.privileged.api jtulach@71: }