Контекст:
Я создал небольшой (java) многопоточный сервер для игры. Несмотря на мои лучшие усилия, следуя лучшим практикам, выяснилось, что некоторые методы, которые должны были быть вызваны только из одного потока, вызывались из двух или более потоков. После отладки и анализа мне удалось "исправить" мой дизайн, но мне было интересно:
Вопрос:
Есть ли инструмент (или если нет - возможно ли это (и как)), чтобы вы могли отметить некоторые методы с аннотациями типа @SingleThread
или @ThreadCount(2)
или @ThreadNameLike("my_fancy_thread_group*")
, которые подсчитывают/контролируют/регистрируют доступ к этим методам, например:
-
@SingleThread
- проверяет, доступен ли этому методу только поток -
@ThreadCount(2)
- достигается двумя потоками точно -
@ThreadNameLike
- доступен только потоками с именем, соответствующим шаблону (-ам)
Идея состоит в том, чтобы выполнить прогон TEST программы и получить хотя бы запись журнала, которая нарушает аннотированное условие.
Я думал, что, возможно, AspectJ может выполнить эту работу до некоторой степени с помощью pointcut, но потом я понял, что какой-то подход, подобный Dagger/Dagger2, будет лучше, т.е. когда вы хотите протестировать свой сервер, вам придется включить обработчик аннотации (предположительно называемый гипотетически "SafetyFirst" ), который будет генерировать классы адаптера (оболочки), которые содержат код мониторинга. Затем вы запустите сервер, запустите несколько нагрузочных тестов, а затем проверьте журналы на наличие нарушений (или в идеальном мире - получите файл отчета).
Я полностью понимаю, что такой инструмент:
- не будет обеспечивать 100% охвата всех потенциальных случаев;
- будет маскировать/запускать heisenbugs
- замедлит рассмотренную программу
но по крайней мере он может служить в качестве системы раннего предупреждения, которая будет явно рекламировать нарушения предполагаемого дизайна.