1

Я хочу добавить Пакеты читать мой PacketHandler в LinkedList для сохранить их с:Java LinkedList возвращает тот же элемент мульти нить

Packet toAdd = handler.handlePacket(socket.getInputStream()); 
synchronized (packetsRead) { 
    packetsRead.addLast(toAdd); 
    if (debug) { 
     System.out.println(packetsRead.getLast().toString()); 
    } 
} 

и читать их с

synchronized (packetsRead) { 
    if (packetsRead.size() > 0) { 
     return packetsRead.pollFirst(); 
    } 
} 

с методом отладки в первом м Это я могу видеть, что последний элемент никогда не бывает прежним. Поэтому в мой список добавляются разные Пакеты.

Но когда я пытаюсь прочитать их из другого потока, у меня всегда были одни и те же пакеты.

Например, если в моем списке 10 различных пакетов, он будет возвращать первый 10 раз.

Как сделать его потокобезопасным?

+1

Почему бы не использовать поточно-безопасные реализации? http://stackoverflow.com/questions/12043948/thread-safe-linkedlist-alternate-use – kosa

+0

Усилиями я синхронизировал его на одном и том же объекте, я применил его для тестирования. sorry – Michii

+0

Как вы получаете доступ к списку, в котором вы читаете поток - вы уверены, что не делаете копию списка каждый раз, чтобы получить всегда первый элемент? – tomse

ответ

0

Не используйте простой LinkedList для одновременных целей:

Обратите внимание, что эта реализация не синхронизирована. Если несколько потоков обращаются к связанному списку одновременно, и по крайней мере один из потоков изменяет список структурно, то его должен быть синхронизирован снаружи.

По меньшей мере, используйте Collections.synchronizedList(), как описано в the LinkedList JavaDocs.

Еще лучше: используйте поточную безопасную параллельную структуру данных, такую ​​как ConcurrentLinkedQueue, ArrayBlockingQueue или LinkedBlockingQueue.

+0

Хотя они будут работать, проблема не решена. – user2864740

1

Код должен быть синхронизирован на том же объекте.

Если это было сделано - и остальная часть программы была правильной, и это было единственное место, к которому был доступ к LinkedList, - тогда он работал бы так, как ожидалось, с потоками или без них. Если использовать один и тот же объект, блоки синхронизации немного невелики, и опубликованный код не показывает проблему.

FWIW: См. Ответ Мэтта для некоторых альтернативных структур данных, не содержащих нитей. Но учтите, что это будет только решить проблему, если проблема не использовала тот же синхронизированный объект.

+0

синхронизирован на том же объекте, он все равно не будет работать:/ Я попробую его с LinkedBlockingQueue или synchronizedList – Michii

+0

. Затем вы не показываете сломанный код и/или все доступ к связанному списку - и переключение на другую структуру будет * не * исправить проблему, которая не использует достаточно большой потокобезопасный регион/конструкцию. – user2864740

+0

Ну, я сказал, что читаю из другого потока, и «pollFirst» всегда возвращает тот же объект. Я изменил его по причинам тестирования до Пакет ответа = пакетыRead.pollFirst(); System.out.println (answer.toString()); ответный ответ; , и это всегда было так же – Michii

Смежные вопросы