Если метод обращается только к локальным переменным, это потокобезопасно. Это оно?
Абсолютно нет. Вы можете написать программу, имеющую доступ только к одной локальной переменной из одного потока, который, тем не менее, не является потокобезопасным:
https://stackoverflow.com/a/8883117/88656
Это относится и к статическим методам?
Точно нет.
Один из ответов, предоставленных @Cybis, звучал так: «Локальные переменные не могут совместно использоваться потоками, поскольку каждый поток получает свой собственный стек».
Точно нет. Отличительной характеристикой локальной переменной является то, что она видна только внутри локальной области , а не то, что она размещена во временном пуле . Это совершенно законно и возможно получить доступ к одной и той же локальной переменной из двух разных потоков. Вы можете сделать это, используя анонимные методы, лямбда-выражения, блоки итераторов или асинхронные методы.
Это относится и к статическим методам?
Точно нет.
Если методу передается ссылочный объект, нарушает ли это безопасность потока?
Может быть.
Я провел некоторые исследования, и есть много примеров определенных случаев, но я надеялся, что смогу определить, используя всего несколько правил, рекомендации, которым нужно следовать, чтобы убедиться, что метод является потокобезопасным.
Вам придется научиться жить с разочарованием. Это очень сложный предмет.
Итак, я предполагаю, что мой главный вопрос: «Есть ли короткий список правил, которые определяют поточно-безопасный метод?
Нет. Как вы видели из моего примера ранее , пустой метод может быть не поточно-ориентированным . Вы также можете спросить: «Есть ли короткий список правил, обеспечивающих корректность метода ». Нет, нет Безопасность потоков - не что иное, как чрезвычайно сложный вид правильности.
Более того, тот факт, что вы задаете вопрос, указывает на ваше фундаментальное недопонимание в отношении безопасности потоков. Безопасность потоков - это глобальное , а не локальное свойство программы. Причина, по которой так трудно получить права, состоит в том, что вы должны полностью знать поведение потоков всей программы , чтобы обеспечить ее безопасность.
Опять же, посмотрите на мой пример: каждый метод тривиален . Именно способ, которым методы взаимодействуют друг с другом на «глобальном» уровне, делает программу тупиковой. Вы не можете смотреть на каждый метод и отмечать его как «безопасный», а затем ожидать, что вся программа безопасна, больше, чем вы можете сделать вывод, что, поскольку ваш дом сделан из 100% -го пустотелого кирпича, этот дом также не полый. Пустота дома - это глобальная собственность всего этого, а не совокупность свойств его частей.