package com.e2u.thread.readwriter; /* * Created on 2005-1-9 TODO To change the template for this generated file go to * Window - Preferences - Java - Code Style - Code Templates */ /* * @author Michelangelo TODO To change the template for this generated type * comment go to Window - Preferences - Java - Code Style - Code Templates */ public class Database { /** * */ private static final int NAP_TIME = 5; private int readerCount; private int writerCount; private boolean dbReading; private boolean dbWriting; public Database() { super(); readerCount = 0; writerCount = 0; dbReading = false; dbWriting = false; // TODO Auto-generated constructor stub } public static void napping() { int sleepTime = (int) (NAP_TIME * Math.random()); try { Thread.sleep(sleepTime * 1000); } catch (Exception e) { e.printStackTrace(); } } public synchronized int startRead() { while (writerCount > 0) { try { System.out.println("reader is waiting"); wait(); } catch (Exception e) { System.out.println(e.toString()); e.printStackTrace(); } } ++readerCount; if (readerCount == 1) { dbReading = true; } return readerCount; } public synchronized int endReading() { --readerCount; if (readerCount == 0) { dbReading = false; } notifyAll(); System.out.println("one reader is done reading. Count=" + readerCount); return readerCount; } public synchronized void startWriting() { ++writerCount; while (dbReading == true || dbWriting == true) { try { System.out.println("Writer is waiting"); wait(); } catch (Exception e) { System.out.println(e.toString()); } } dbWriting = true; } public synchronized void endWriting() { --writerCount; dbWriting = false; System.out.println("one writer is done writing. Count=" + writerCount); notifyAll(); } }