public class SmarterLock implements ReadWriteLock {
    int readingReaders = 0;
    int waitingWriters = 0;
    boolean writing = false;

    public synchronized void beginRead() {
	while (writing || waitingWriters > 0) {
	    try {
		wait();
	    } catch (InterruptedException e) {
	    }
	}
	readingReaders++;
    }

    public synchronized void endRead() {
	readingReaders--;
	notifyAll();
    }

    public synchronized void beginWrite() {
	waitingWriters++;
	while (writing || readingReaders > 0) {
	    try {
		wait();
	    } catch (InterruptedException e) {
	    }
	}
	waitingWriters--;
	writing = true;
    }

    public synchronized void endWrite() {
	writing = false;
	notifyAll();
    }
}
