Usted tiene dos opciones: la más fácil dada su código que se presenta es la palabra clave volatile
. declare needsToBeThreadSafe
como static volatile int
y eso garantizará que cualquier hilo que haga referencia a esa variable obtendrá la "última" copia, y la variable no se almacenará en caché dentro de su código.
Dicho esto, si usted quiere asegurarse de manera más general que M1()
y M2()
ejecutar "atómicamente" (o al menos exclusivamente el uno del otro), entonces usted desea utilizar un lock
. La sintaxis es más limpia con un "bloque de bloqueo", como este:
private static object locker = new Object();
//..
public static void M1()
{
lock(locker)
{
//..method body here
}
}
public static void M2()
{
lock(locker)
{
//..method body here
}
}
En cuanto a qué postura tomar, eso depende de usted y debe ser determinado por el código. Si todo lo que necesita es garantizar que una asignación de miembro se propague a todos los hilos y no se almacene en caché, entonces la palabra clave volatile
es más simple y hará el trabajo bien. Si está más allá de eso, es posible que desee ir con el lock
.
¿Quiere decir que desea que las llamadas a M1() y M2() ser atómicas? – Bombe
¿Qué quiere decir con "stay thread safe"? –