Вопрос очень общий, поэтому, пожалуйста, не ожидайте никакой конкретики от моего ответа.
1_ Нам нужно быть более осторожными со статическими методами, чем, скажем, с методами экземпляра.
2_ @Justmycorrectopinion - это правильно, но некоторые из описанных им терминов должны быть более тщательно проработаны, чтобы быть совершенными.(Даже если статический метод работает только с локальной переменной, все еще существует возможность состояния гонки.)
3_ Для меня есть простые правила, которые помогли мне проанализировать безопасность потоков.
Понять, является ли каждый компонент, инкапсулированный в нем, совместным или нет.Таким образом, самое простое решение состоит в том, чтобы уменьшить область видимости всех переменных и увеличить область видимости только в случае крайней необходимости, и если компонент выполняет мутацию объекта, это обычно не безопасно для потоков.
4_ Используйте поддержку инструментов для выполнения статического анализа кода на предмет безопасности потоков.(Идея имеет плагин checkthread).
5_ Никогда не используйте статический метод для выполнения мутации объекта.Если вызов статической переменной вызывает мутацию объекта, то разработчик просто обходит OOPS.
6_ Всегда документируйте безопасность потоков.Помните, что при разработке не обязательно синхронизировать какой-либо метод, но его можно сделать не очень безопасным для потоков.
7_ И последнее, но, пожалуй, самое важное, убедитесь, что большинство ваших объектов неизменны.По моему опыту, большую часть времени мне никогда не приходилось делать многие мои объекты изменяемыми.(В редких случаях, когда необходимо изменить состояние объекта, защитное копирование / создание нового объекта почти всегда лучше.)