メソッドにコール スタックがあるわけではないことに注意してください。スレッドにはコール スタックがあります。メソッドはスレッドによって呼び出されます。
メソッドがインライン化されていない限り、メソッドを呼び出すとパラメーターがコール スタックにプッシュされる可能性がありますが、確実に戻りアドレスがコール スタックにプッシュされます。
各スレッドのコール スタックは、他のスレッドのコール スタックから独立しています。スタックのみがアクセスされる場合、メソッドはスレッドセーフです。
メソッドをスレッドセーフにしないために、他のストレージにアクセスすることができます。これには、静的データとインスタンス データ、およびそれらによって参照されるオブジェクトが含まれます。静的メソッドはインスタンス データにアクセスできないため、スレッド セーフになりやすくなります。静的データ、または静的データによって参照されるオブジェクトへのアクセスにのみ注意する必要があります。
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これは、上記の単純な static フィールドと同じようにスレッドセーフではありません。