У вас есть два варианта: самый простой из представленных вами кодов - это ключевое слово volatile
. объявите needsToBeThreadSafe
как static volatile int
, и это гарантирует, что любой поток, ссылающийся на эту переменную, получит «самую последнюю» копию, и переменная не будет кэширована в вашем коде.
При этом, если вы хотите в более общем плане обеспечить выполнение M1()
и M2()
"атомарно" (или, по крайней мере, исключительно друг от друга), то вы хотите использовать lock
. Самый чистый синтаксис с «блокировкой блокировки», например:
private static object locker = new Object();
//..
public static void M1()
{
lock(locker)
{
//..method body here
}
}
public static void M2()
{
lock(locker)
{
//..method body here
}
}
Какой подход выбрать, это зависит от вас и должно определяться кодом. Если все, что вам нужно, это убедиться, что назначение члена распространяется на все потоки и не кэшируется, тогда ключевое слово volatile
проще и отлично справится с задачей. Если это за пределами этого, вы можете пойти с lock
.