线程安全环缓冲区

时间:2016-08-19 15:07:23

标签: java multithreading data-structures buffer

我有这个最大大小为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;
}

}

1 个答案:

答案 0 :(得分:0)

使用:

if(wp==9)
    wp=0;
else
    wp++;

在多线程环境中表现不佳。一个线程很可能执行if(wp==9)并找到它false然后向其添加1,同时另一个线程刚刚找到8处的值并递增它到9。然后,第一个帖子执行wp++,它现在保持10

你应该使用类似的东西:

wp = (wp+1)%10;

你也在其他地方这样做。

这可能不是 问题,因为它会因IndexOutOfBoundsException而崩溃,但代码肯定是 问题。