public class WriterReader {
public static void main(String[] args) {
CubbyHole db=new CubbyHole();//缓冲区
Reader r1=new Reader(1,db);//定义读者r1
Reader r2=new Reader(2,db);//定义读者r2
Writer w1=new Writer(1,db);//定义写者w1
r1.start();
r2.start();
w1.start();
}
}
class CubbyHole {
private int readerCount;//读者数
private int writerCount;//写者数
private boolean dbReading;//读信号量
private boolean dbWriting;//写信号量
public CubbyHole() {
readerCount=0;
writerCount=0;
dbReading=false;
dbWriting=false;
}
public synchronized int startRead(){//开始读
while(writerCount>0){
try{
System.out.println("reader is waiting");
wait();//等待写者发出notify
}
catch(Exception e){
}
}
++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. readerCount="+readerCount);
return readerCount;
}
public synchronized void startWriting(){//开始写
++writerCount;
while(dbReading==true||dbWriting==true){
try{
System.out.println("Writer "+writerCount+" is waiting");
wait();//等待读者发出notify
}
catch(Exception e){
}
}
dbWriting =true;
}
public synchronized void endWriting(){//结束写
--writerCount;
if(writerCount==0){//没有写者
dbWriting=false;
}
System.out.println("one writer is done writing. writerCount="+writerCount);
notifyAll();
}
}
class Reader extends Thread{//定义读线程,继承Thread类,重写run方法
private CubbyHole C;
private int readerNum;
public Reader(int r,CubbyHole db) {
readerNum=r;
C=db;
}
public void run(){
int c;
//while(true)
for ( int i = 0 ; i < 5 ; i++)
{
System.out.println("reader "+readerNum+" wants to read");
c=C.startRead();
System.out.println("reader "+readerNum+" is reading. readerCount="+c);
c=C.endReading();
System.out.println("It is reader "+readerNum+" who has done reading. readercount="+c);
}
}
}
class Writer extends Thread{//定义写线程
private CubbyHole C;
private int writerNum;
public Writer(int w,CubbyHole db) {
writerNum=w;
C=db;
}
public void run(){
// while(true)
for ( int i = 0 ; i < 5 ; i++)
{
System.out.println("Writer "+writerNum+" wants to write");
C.startWriting();
System.out.println("Writer "+writerNum+" is writing");
C.endWriting();
System.out.println("It is Writer "+writerNum+" who has done writing .");
}
}
}