0

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

Я обнаружил проблемы, связанные с согласованностью, и вам необходимо соответствующим образом синхронизировать их по мере необходимости. Речь идет о вызове метода для объекта, который находится в потоке, который в настоящее время выполняется. Рассмотрим следующий пример (это экспериментально, поэтому извините за любой плохой выбор дизайна):

  1. У меня есть JSP, который выполняет поиск и возвращает результаты. Ответ должен быть отправлен пользователю в течение 10 секунд (независимо от того, удалось ли выполнить поиск).
  2. JSP создает ThreadPoolExecutor и использует для запуска поисковой строки.
  3. JSP уходит спать в течение 2 секунд.
  4. JSP просыпается и проверяет, есть ли в результатах поиска какие-либо результаты. Поиск obj предоставляет метод getCurrentResultsCount(), который возвращает int count результатов, найденных до сих пор.
  5. Шаги 3 & 4 повторяются 5 раз, после чего ответ отправляется пользователю. Поток поиска будет продолжаться до тех пор, пока это необходимо (после завершения, результаты сохраняются в контексте сервлета или базы данных и могут быть доступны позже)

Мой код выглядит следующим образом:

ThreadPoolExecutor pool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); 
SearchWidget searchWidget = new SearchWidget(searchTerm); 
Future<?> searchWidgetFuture = pool.submit(searchWidget); 
Thread.sleep(2000); 
System.out.println("1. Results so far:" + searchWidget.getCurrentResultsCount()); 
Thread.sleep(2000); 
System.out.println("2. Results so far:" + searchWidget.getCurrentResultsCount()); 
Thread.sleep(2000); 
System.out.println("3. Results so far:" + searchWidget.getCurrentResultsCount()); 
... 
... 

Есть ли что-то не так или рискованно при вызове метода getCurrentResultsCount(), как я это делаю? Кажется, что он работает нормально при использовании малого объема, но я рискую проблемами, если есть более высокий объем?

Любая помощь очень ценится. Благодаря!

ответ

1

Есть ли что-то не так или рискованно при вызове метода getCurrentResultsCount(), как я это делаю?

Нет, нет ничего плохого, пока getCurrentResultsCount() обращается некоторое синхронизированное полем, поскольку общие данные обновляются и доступны в двух разных потоках. Я бы рекомендовал использовать AtomicInteger для хранения такой информации.

Кажется, что он работает нормально при использовании малого объема, но я рискую проблемами, если есть более высокий объем?

Вы платите штраф производительности для обновления volatile поля (внутри AtomicInteger), но относительно мало. На поверхности не о чем беспокоиться. Увеличение количества фоновых задач значительно затмит любой обмен данными между вашими JSP и потоками.

+0

Отлично, спасибо за обновление. Всегда полезно получить некоторый экспертный ввод. Что касается синхронизации, существует ли настоящая потребность в синхронизации доступа к переменной, если только один поток обновляет ее, и только один поток читает ее? Скажем, виджет поиска продолжает добавлять результаты в ArrayList, и JSP периодически проверяет, сколько результатов есть (или даже получает последние добавленные результаты из ArrayList внутри виджета поиска), мне нужно беспокоиться о синхронизации доступа к ArrayList? (предполагая, что JSP-код отслеживает последний выбранный индекс, поэтому никакие записи не удаляются из ArrayList). – Mohammad

+0

Существует необходимость синхронизации, если значения должны быть соответствующим образом обновлены. В противном случае ваш JSP никогда не сможет увидеть правильное значение. Он не бросал бы, но это было бы непредсказуемо. Что касается 'ArrayList', единственный раз, когда вы можете делиться« ArrayList »между потоками, это если он не изменяется. Если автор вносит какие-либо изменения, это может привести к тому, что несинхронизированный читатель выкинет исключение. – Gray

+0

В целом, беспокоиться об этих проблемах с производительностью является преждевременная оптимизация. Вы пишете веб-приложение, и синхронизация будет небольшим небольшим процентом загрузки сервера @Mohammad. – Gray

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