乒乓缓冲机制在很多场合都有应用价值,将其抽象成某种通用化类库,使代码得以复用。那么首先就要抽象出此机制的抽象模型。
乒乓缓冲应该有两个相同的对象作为缓冲区(对象类型可以是任意的),两者交替地被读和被写。在卷轴的例子中,向可见区域移动就是读操作,生成并绘制就是写操作。读写的过程在两个缓冲区之间交替进行:一开始两个缓冲内容均无效,不能被读;然后写0,完毕后0可读,再写1使1可读,同时可以读0,读完后0变成可写状态;1写毕后变成可读状态……由此可见对于每个缓冲区来说,可能的状态有四种并按如下顺序循环往复地转换:可读=>在读=>可写=>在写=>可读=>……
一个BiBuf类负责维护两个缓冲对象(长度为2的Object类型数组,名为bufs)及记录其状态。状态常量这样设定:0=在读, 1=可读(写毕), 2=可写(读毕), 3=在写。 于是两个缓冲状态的表示用一个长度为2的byte型数组即可(当然完全可以放在一个byte变量的高4位和低4位,不过不够清晰易懂)。但仅有这个指示某块缓冲“可以做什么”的变量还不够,还要有个指示“应该做什么”的变量。因为对于单一的读或写操作来说,可操作的缓冲对象必须是交替轮换的,比如两个缓冲都写满之后,都是可读的状态,这时实际应读哪一个呢?所以还应该有两个变量bufToRead和bufToWrite,分别指示当前应该读和应该写的缓冲序号。
缓冲对象数组被设成私有的以阻止外部对象直接对其操作。为了读写,