java - 线程安全问题

标签 java multithreading thread-safety

我有一个要处理的带有对象的LinkedList。对象是从另一个线程添加到其中的,但是只有一个线程从中删除/读取了该对象。

private LinkedList<MyObject> queue = new LinkedList<>();

new Thread()
{
    @Override
    public void run()
    {
        while (!Thread.interrupted())
        {
            if (!queue.isEmpty())
            {
                MyObject first = queue.removeFirst();
                // do sth..
            }
        }
    }
}.start();

在另一个线程中,我将对象添加到队列中
queue.add(new MyObject());

有时,这段代码会导致Exception,我无法真正向自己解释。
线程“”中的异常java.util.NoSuchElementException
在java.util.LinkedList.removeFirst(LinkedList.java:270)

我不明白,为什么会得到此异常,因为它仅应尝试删除一个存在的对象。

最佳答案

正如Nicolas已经提到的那样,您需要一个线程安全的实现。我建议使用LinkedBlockingQueue

您可以使用offer方法添加到它,并使用take删除它,这也可以解决您的“忙碌等待”问题。

关于java - 线程安全问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39976466/

相关文章:

c++ - 多线程 gdb - 在崩溃前跟踪变量变化

java - 仅当线程尚未运行时才在线程中运行更新操作

java - 如何简化注释

java - 在架构定义中创建具有空白命名空间的嵌套元素

java - 如何保证 Java 中文件的原子移动或异常?

C#多线程自增

java - 字符串替换方法 |加密与解密

java - ReentrantReadWriteLock 即使其状态为 Unlocked 也无法获得锁定

java - 如果单例 getInstance() 方法未同步,Junit 测试将失败

java - 对所有线程具有完全原子性,而不影响性能或吞吐量