Avete due scelte: il più facile dato il vostro codice presentato è la parola chiave volatile
. dichiarare needsToBeThreadSafe
come static volatile int
e ciò garantirà che qualsiasi thread che fa riferimento a tale variabile riceverà la copia "più recente" e la variabile non verrà memorizzata nella cache all'interno del codice.
Detto questo, se si vuole garantire più in generale che M1()
e M2()
eseguire "atomico" (o almeno esclusivamente l'uno dall'altro), poi si desidera utilizzare un lock
. La sintassi è più pulita con un "blocco di blocco", in questo modo:
private static object locker = new Object();
//..
public static void M1()
{
lock(locker)
{
//..method body here
}
}
public static void M2()
{
lock(locker)
{
//..method body here
}
}
Come al quale approccio adottare, che sta a voi e dovrebbe essere determinata dal codice. Se tutto ciò di cui hai bisogno è garantire che l'assegnazione di un membro venga propagata a tutti i thread e non sia memorizzata nella cache, la parola chiave volatile
è più semplice e farà bene il lavoro. Se è oltre questo, potresti voler andare con lo lock
.
fonte
2009-08-10 13:06:57
Vuoi dire che si desidera che le chiamate a M1() e M2() essere atomica? – Bombe
Cosa intendi per "rimane thread-safe"? –