import java.util.concurrent.*;


public class  ReadersWriters15 implements Runnable
{
    private int  readers = 0;
    private boolean  someoneiswriting = false;
    private Semaphore readingallowed = new Semaphore(1, true);
    private Semaphore writingallowed = new Semaphore(1, true);

    public void beginreading() {
              if ((someoneiswriting) || readingallowed.hasQueuedThreads() )
                 readingallowed.tryAcquire();
              readers= readers+1;
              readingallowed.release();
    }
    public void finishreading() {
              readers= readers-1;
              if (readers == 0)  writingallowed.release();
    }
    public void beginwriting()  {
              if ((readers > 0) || someoneiswriting)
                    writingallowed.tryAcquire();
              someoneiswriting= true;
    }
    public void finishwriting() {
              someoneiswriting= false;
              if (readingallowed.hasQueuedThreads())
                   readingallowed.release();
              else
                   writingallowed.release();
    }

    public void run()
    {
		super();
	}
 }