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