У меня есть некоторые данные (два HashSet и метка времени Instant), которыми я бы хотел, чтобы все запросы к моему гаджету/плагину JIRA (OpenSocial?) поможет запросам быть более производительными.
Иногда (очень редко) запрос может включать параметр, указывающий, что эти общие данные должны быть обновлены. И, конечно, в первый раз, когда это необходимо, оно заполняется. Это нормально, когда данные представляют собой устаревший ответ — они основаны на вещах, которые меняются медленно, и используются для визуализации тенденций, поэтому допустимы ошибки, связанные с ошибками.
Я предполагаю, что когда JIRA запускается (или я загружаю новую версию своего дополнения) и в течение первых нескольких минут поступает несколько запросов, мне нужно будет обрабатывать заполнение этих дорогостоящих общих данных потокобезопасным способом. . В настоящее время результаты выглядят нормально, но, насколько я понимаю, это было просто случайно.
Только один поток должен выполнять работу по заполнению. При запуске другим потокам, конечно, придется ждать, потому что они не могут пропустить вперед с пустыми руками. (Если все потоки выполняют дорогостоящую инициализацию, это создает большую ненужную нагрузку на сервер)
Но после первоначальной стоимости, если поступает несколько одновременных запросов, и один из них включает параметр «обновить», только этот один поток должен заплатить цену — я согласен с другими потоками, использующими старую копию дорогостоящих данных. и, таким образом, оставаться производительным и включать в ответ, что «да, кто-то обновляет данные, но вот результат с использованием старой копии».
Подробнее о данных: два HashSet и отметка времени предназначены для представления согласованного моментального снимка во времени. Содержимое HashSet зависит только от значений в базе данных, а отметка времени — это только время самого последнего обновления. Никакие из этих данных не зависят от какого-либо более раннего моментального снимка во времени. И это тоже не зависит от состояния программы. Временная метка используется только для грубого ответа на вопрос «сколько лет этим данным». Каждый раз, когда данные обновляются, я ожидаю, что временная метка будет более новой, но ничего не сломается, если это неправильно. Это просто для отладки и прозрачности. Поскольку моментальный снимок не зависит от более ранних моментальных снимков или состояния программы, он может быть заключен в оболочку и помечен как volatile.
Есть ли очевидный выбор лучшего способа сделать это? Плюсы и минусы альтернатив?