java - 线程安全的循环缓冲区?

标签 java thread-safety

我有 2 个线程,一个插入数据,第二个线程检索数据。
我得到了非常奇怪的结果。

线程安全吗?

如果不行,如何解决?

这是我的循环缓冲区:

private int mBufferSize;
    private int startPointer = 0;
    private int endPointer = 0;
    private int bufferSize = 0;
    private String[] buffer;

    public BBuffer(int size) {
        mBufferSize = size;
        startPointer = 0;
        endPointer = 0;
        bufferSize = 0;
        buffer = new String[mBufferSize];
    }


    public String[] getData() {
        String data = null;

        if (!isEmpty()) {
            bufferSize--;
            startPointer = (startPointer + 1) % mBufferSize;
            data = (String) buffer[startPointer];


        } else {

            System.err.println("!");
            return null;
        }

        return data.split(",");
    }

    public  void addData(String data) {
        if (!isFull()) {
            bufferSize++;
            endPointer = (endPointer + 1) % mBufferSize;
            buffer[endPointer] = data;
            System.out.println("->"+data);
        } else {
            System.out.println("full");
        }
    }

    public boolean isEmpty() {
        return bufferSize == 0;
    }

    public boolean isFull() {
        return bufferSize == mBufferSize;
    }

}

最佳答案

根本不是线程安全的。

您只需将 synchronized 关键字添加到 4 个方法的声明中即可。您很幸运,这样一个简单的解决方案适用于您的类(class),因为情况并非总是如此。

一个潜在的棘手问题是 getData 返回的 String[]。您在每次调用时都会创建一个新数组,因此不会有任何问题,但如果它返回了对内部数组的一些引用,同步就会很复杂。

关于java - 线程安全的循环缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8422184/

相关文章:

java - 在 Jython 中访问 Java 类的成员时出现 AttributeError

c# - 使用什么代替 Interlocked.Equals

java - 在android中等待并通知

java - 如何使循环队列完全线程安全

multithreading - 从不同的线程写入相邻的数组元素?

java - 我收到错误: java: '.class' expected, i think it has something to do with my for loop (I'm a begginner) [closed]

java - 在实践中,什么情况下操作系统/CPU 不会产生非 volatile Java 变量的最终一致性?

java - Spring-kafka 偏移提交方式

java - Jackson:不同的 XML 和 JSON 格式

c++ - 从可能由不同线程修改的位集 (C++) 访问(读取)位是否安全