Обратите внимание, что метод не имеет стека вызовов - у потока есть стек вызовов. Методы вызываются потоком.
Если метод не встроен, его вызов может выдвинуть параметры в стек вызовов, но определенно передаст адрес возврата в стек вызовов.
Каждый стек вызовов потока не зависит от стека вызовов любого другого потока. Если доступен только стек, метод является поточно-ориентированным.
Можно получить доступ к другому хранилищу, чтобы сделать метод не поточно-ориентированным. Это включает в себя статические данные и данные экземпляров, а также объекты, на которые они ссылаются. Статический метод не имеет доступа к данным экземпляра, что делает его более потокобезопасным. Вам нужно только следить за доступом к статическим данным или объектам, на которые ссылаются статические данные:
private static int _balance;
private static void ThreadSafetyIssues()
{
// Not thread safe
int temp = _balance;
temp ++;
_balance = temp;
// Not thread safe
temp = (int) HttpContext.Current.Session["balance"];
temp ++;
HttpContext.Current.Session["balance"] = temp;
}
Свойство HttpContext.Current
является статическим. Это означает, что любой поток может получить доступ к контексту одновременно, включая Session
. Это так же не поточнобезопасно, как простое статическое поле _balance
выше.