public synchronized boolean closeBuf(Object buf) {
int bufid;
if (bufs[0]==buf) bufid=0;
else if (bufs[1]==buf) bufid=1;
else return false;
try {
if (rwstat[bufid]==WRITING) {
//若该块缓冲是被写的
rwstat[bufid]=WRITTEN;//设状态为可读
bufToWrite=1-bufToWrite;//当前应写的缓冲切换到另一个
return true;
}
else if (rwstat[bufid]==READING) {
//若该块缓冲是被读的
if ((--readingReaders)==0) rwstat[bufid]=READDONE;//递减读者数量。若减到0则置状态为可写
bufToRead=1-bufToRead;//当前应读的缓冲切换到另一个
return true;
}
else return false;
}finally {
notifyAll();//唤醒所有因条件不满足而等待的线程
}
}
//……
两个缓冲对象的初始化操作通过方法initdata来完成。它既可以接默认设计直接在由构造方法参数传入的对象数组上进行初始化,也可以自己生成一个新的数组,具体如何做完全交给子类去重写,赋予这个设计以充分的灵活性。下面是该类的其余部分代码:
public class BiBuffer {
private Object bufs[];
private byte rwstat[];
private int bufToRead, bufToWrite;
private int readingReaders;
public static final byte READING = 0;
public static final byte WRITTEN = 1;
public static final byte READDONE = 2;
public static final byte WRITING = 3;
public Object[] initdata(Object[] data) {
//子类可重写之
return data;
}
public Object copydata(Object src) {
//子类可重写之
return src;
}
public void reset() {
rwstat[0]=READDONE; rwstat[1]=READDONE;
readingReaders=0;
bufToWrite=0; bufToRead=0;
}
public BiBuffer(Object[] data) {
rwstat=new byte[2];
reset();
bufs=initdata(data);
}