我有这个最大大小为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;
}
}
答案 0 :(得分:0)
使用:
if(wp==9)
wp=0;
else
wp++;
在多线程环境中表现不佳。一个线程很可能执行if(wp==9)
并找到它false
然后向其添加1
,同时另一个线程刚刚找到8
处的值并递增它到9
。然后,第一个帖子执行wp++
,它现在保持10
。
你应该使用类似的东西:
wp = (wp+1)%10;
你也在其他地方这样做。
这可能不是 问题,因为它会因IndexOutOfBoundsException
而崩溃,但代码肯定是 问题。