Очередь LinkedList и безопасность потоков - PullRequest
0 голосов
/ 20 октября 2011

У меня есть один поток, который add() объектов в очередь LinkedList, и другой поток, который poll() очередь для объектов для обработки.Это единственные два метода, которые я использую в своей очереди.Я никогда не перебираю очередь, не добавляю и не удаляю объекты в середине списка.Я не могу придумать сценарий, когда два потока наступают друг на друга и каким-то образом портят данные, но, возможно, мне просто не хватает воображения.

Нажатие происходит редко (несколько раз в секунду), но опрос очень част(пару тысяч раз в секунду).Интересно, сколько я получу за синхронизацию add() и poll().Это работает на Android.

Редактировать: Я не ищу BlockingQueue;Я блокирую ввод-вывод, а не объекты в очереди:

Метод run() в потоке опрашивает блоки, ожидающие, когда пространство станет доступным в выходном буфере.Когда пространство становится доступным, он проверяет наличие объектов в очереди.Если он доступен, он сериализует его в выходной буфер.Если очередь пуста (т. Е. poll() возвращает null), она poll() других очередей с более низким приоритетом и, если все они пустые, сериализует сообщение «данные недоступны сейчас».

Ответы [ 2 ]

5 голосов
/ 20 октября 2011

Ум не имеет Android BlockingQueues ? Они предназначены именно для этого сценария, без понятия, почему вы хотите использовать что-то еще - не можете стать намного более эффективным ..

2 голосов
/ 20 октября 2011

Без синхронизации вы можете получить случай, когда поток чтения опрашивает объект, который был ПРОСТО добавлен в очередь, и что список еще не закончил выход из метода add ().

Если вы загляните в источник, то можно что-то напутать с помощью «Ожидаем. Мод. Количество = l.modCount;»потому что защелка для опроса основана на строке под ним до того, как modCount будет фактически изменен.

По сути, ваше удаление происходит в идеальное время, возможно, с 1 элементом, при добавлении другого в то же время, ичто-то не так.

Чтобы предотвратить это, вы можете заключить свои обращения в синхронизированные блоки (lst) {} или использовать параллельные классы.Я бы предпочел параллельные очереди, потому что опрос не должен вращаться - у вас может быть блокирующая функция take ().

Возможно, вы ищете: java.util.concurrent.ArrayBlockingQueue

ArrayBlockingQueue<String> que = new ArrayBlockingQueue<String>(100);
    que.add("");
    que.take();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...