【发布时间】:2016-12-26 19:27:14
【问题描述】:
我有这个最大大小为 10 的环形缓冲区。有两个线程共享它的对象。一个线程推送新元素,另一个将其弹出。当缓冲区为空或已满时,线程应该等待而不是替换元素。 问题是跳过了一些随机字符。
public class CircularBuffer {
private byte[][] data = new byte[10][1024];
private int[] numRead = new int[10];
private int rp,wp,num; //read pointer,write pointer,no of data
public boolean isReadComplete;
public boolean isComplete;
private final Lock lock = new ReentrantLock();
public CircularBuffer()
{
rp=0;
num=0;
wp=0;
isReadComplete=false;;
isComplete=false;
}
public boolean isEmpty()
{
if(num==0)
return true;
else
return false;
}
public void push(byte d[],int n)
{
while(num==10){
System.out.println("read waiting");
}
data[rp]=d;
numRead[rp]=n;
try{
lock.lock();
num++;
}
finally
{
lock.unlock();
}
if(rp==9)
rp=0;
else
rp++;
}
public boolean pop(Byt b)
{
while(num==0){
if(isReadComplete)
{
isComplete=true;
System.out.println("Done writing");
return true;
}
System.out.println("write waiting");
}
b.b=data[wp];
b.numRead=numRead[wp];
try{
lock.lock();
num--;
}
finally
{
lock.unlock();
}
if(wp==9)
wp=0;
else
wp++;
return false;
}
}
【问题讨论】:
-
有一个无锁环形缓冲区here。
标签: java multithreading data-structures buffer