J'ai un doute général concernant la publication des données et des changements de données entre les threads. Considérons par exemple la classe suivante.La visibilité des objets sur les threads
public class DataRace {
static int a = 0;
public static void main() {
new MyThread().start();
a = 1;
}
public static class MyThread extends Thread {
public void run() {
// Access a, b.
}
}
}
Nous allons nous concentrer sur main().
Il est clair que
new MyThread().start();
a = 1;
Il nous changeons la variable partagée un après l'MyThread est démarré et ne peuvent donc pas être une publication de thread-safe.
a = 1;
new MyThread().start();
Mais cette fois le changement dans une est en toute sécurité publié à travers le nouveau fil, depuis Java Language Specification (JLS) garantit que toutes les variables qui étaient visibles à un fil A quand il démarre un thread B sont visibles pour le fil B, qui est effectivement comme avoir une synchronisation implicite dans Thread.start().
new MyThread().start();
int b = 1;
Dans ce cas, lorsqu'une nouvelle variable est allouée après que les deux fils ont été donné naissance, est-il une garantie que que la nouvelle variable sera publié en toute sécurité à toutes les discussions. c'est-à-dire que si var b est accédé par l'autre thread, est-il garanti de voir sa valeur comme 1. Notez que je ne parle pas de modifications ultérieures de b après cela (qui doit certainement être synchronisé), mais la première allocation par le jvm.
Merci,
Lorsqu'une nouvelle variable est allouée après que les deux threads ont été générés, est-il garanti que la nouvelle variable sera publiée en toute sécurité sur tous les threads. c'est-à-dire si var b est accédé par l'autre thread, est-il garanti de voir sa valeur comme 1? – baskin
Cela dépend vraiment de la situation exacte. Il doit y avoir quelque chose de spécifique pour garantir à la fois que le thread de lecture n'utilise pas une valeur mise en cache et que le thread d'écriture a publié l'écriture dans la mémoire partagée. Voir le chapitre 17 de la spécification référencée ci-dessus pour plus de détails (brain-busting). –
"Rincé à la mémoire partagée"? (Faites-vous référence au tas?) Il n'y a aucun rinçage impliqué, car cela n'a rien à voir avec la sémantique du flux. L'affectation de valeur est atomique (avec une mise en garde mineure concernant les longs) dans la JVM. Après que a = 1 s'exécute, la variable: DataRace.a a la valeur de 1. Si un thread est engendré avant l'instruction a = 1, il n'y a aucune garantie quant à la valeur de DataRace.a qu'il verra. Il est certainement possible que le thread démarre et puis permute, et le thread principal s'exécute, et définit a = 1, puis l'autre thread verra un == 1. Il est plus probable qu'il verra a == 0. –
alphazero