java - 列出并发失败

标签 java android multithreading list concurrency

我有一个 Arraylist,我不断地在单独的线程中添加和删除它。 一个线程添加,另一个线程删除。

这是包含更改列表的类:

public class DataReceiver {
    private static final String DEBUG_TAG = "DataReceiver";

    // Class variables
    private volatile ArrayList<Byte> buffer;
    //private volatile Semaphore dataAmount;

    public DataReceiver() {
        this.buffer = new ArrayList<Byte>();
        //this.dataAmount = new Semaphore(0, true);
    }

    // Adds a data sample to the data buffer. 
    public final void addData(byte[] newData, int bytes) {
        int newDataPos = 0;

        // While there is still data
        while(newDataPos < bytes) {
            // Fill data buffer array with new data
            buffer.add(newData[newDataPos]);
            newDataPos++;
            //dataAmount.release();
        }

        return;
    }

    public synchronized byte getDataByte() {
/*
        try {
            dataAmount.acquire();
        }
        catch(InterruptedException e) {
            return 0;
        }
*/
        while(buffer.size() == 0) {
            try {
                Thread.sleep(250);
            }
            catch(Exception e) {
                Log.d(DEBUG_TAG, "getDataByte: failed to sleep");
            }
        }

        return buffer.remove(0);
    }
}

问题是我在尝试 buffer.remove(0) 时经常遇到空指针异常。从代码中的注释中可以看出,我曾尝试使用信号量,但它仍然间歇性地抛出空指针异常,因此我创建了自己的 sleep 轮询类型作为半概念验证。

我不明白为什么会出现空指针异常和/或如何修复它。

最佳答案

如果您在不同的线程中处理对象初始化,则构造函数可能在

 public synchronized byte getDataByte() 

被调用因此导致 NullPointerException 因为

this.buffer = new ArrayList<Byte>(); 

从未被调用过。

关于java - 列出并发失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19691767/

相关文章:

java - 使用 Jackcess 在 Java 中创建新的 MS Access 文件

android - ImageViews 在多个屏幕中的准确位置

java - 无法弄清楚如何显示 Android 对话框

android - 导航拱形组件和 fragment 娱乐

C++ boost 线程重用线程

c# - 如何将多个参数传递给 C# 线程?

c - PTHREAD_COND_INITIALIZER - 函数 pthread_cond_wait() 分支到慢速路径

java - 如何使用 servlet 扫描整个 HTML 页面?

java - 碰撞检测教程

java - 如何在 Java 中将 "dd.MM.yyyy G"解析为 ISO-Date?