У меня есть 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();
В другой Thread добавить объекты в очередь
queue.add(new MyObject());
Иногда этот код приводит к исключению, хотя, что я не могу действительно объяснить себе. Исключение в потоке «» java.util.NoSuchElementException в java.util.LinkedList.removeFirst (LinkedList.java:270)
я не получаю, почему я получаю это исключение, так как он должен только попытаться удалить если существует.
Ваш потребительский поток выполняет «ожидание», когда очередь пуста. Вероятно, вы должны исправить это. –
Немного глупо, но поскольку эти вещи могут быть очень трудными для прогнозирования, я предлагаю вам убедиться, что действительно существует только один поток, вызывающий метод removeFirst. Добавьте печать идентификатора потока внутри оператора if. – TheFooBarWay
@ TheFooBarWay Не имеет значения, есть ли один потребитель или два. Существует несколько производителей, которых достаточно, чтобы вызвать проблемы синхронизации. Если у вас более одного потока, изменяющего объект, он должен быть синхронизирован. Если у вас было ровно одно изменение потока и чтение нескольких потоков, тогда он может быть несинхронизирован (но повторение может быть сложным). –