Допустим, у меня есть статический класс со статическим методом. Несколько потоков могут вызывать этот статический метод одновременно.
OK.
Есть ли вероятность расы при следующих обстоятельствах:
а - если метод зависит только от локальных переменных
Да, есть потенциальные условия гонки.
b - если метод зависит от локальных переменных и полей-членов
Да, есть потенциальные условия гонки.
Ответы на (a) и (b) являются следствием более общего правила, а именно: всегда потенциал для условий гонки любой раз, когда вы позвоните любой метод из нескольких потоков. Например, эта программа блокируется:
class MyClass
{
static MyClass()
{
// Let's run the initialization on another thread!
var thread = new System.Threading.Thread(Initialize);
thread.Start();
thread.Join();
}
static void Initialize()
{ }
static void Main()
{ }
}
У него нет полей, два метода, которые абсолютно ничего не делают, и одна локальная переменная, доступ к которой возможен только в одном потоке. И тем не менее, это сразу и последовательно тупики. (Вы понимаете, почему? Подробнее об этой программе см. http://ericlippert.com/2013/01/31/the-no-lock-deadlock/.)
Похоже, вы ищете гарантию, что ваша программа является поточно-ориентированной, если ваши статические методы не обращаются к полям. Такой гарантии нет. Ваша программа является поточно-безопасной тогда и только тогда, когда вы пишете ее как поточно-безопасную.