2010-10-17 14 views
0

J'ai lu que le code à l'intérieur d'un bloc synchronisé est conforme à la sémantique 'arrive avant' de sorte que toutes les valeurs écrites à l'intérieur d'un bloc synchronisé soient visibles aux autres threads successivement. En outre, j'ai lu que les caches ne sont effacées qu'avec la fin du bloc synchronisé. Comment la sémantique ci-dessus de «se produit avant» doit-elle être appliquée dans le scénario décrit ci-dessous si seulement les caches sont vidées de la terminaison de bloc synchronisée?Comportement de

Fil A a une référence à l'objet C et modifie un champ de C dans son code synchrone synchronisé sur C. fil B a également une référence à l'objet C. Filetage maintenant A est mis en suspension avant le code synchronisé est terminé . Le thread B passe à l'action et accède au champ de l'objet C dans le code sans synchronisation sur C.

Le thread B est-il garanti de voir les modifications apportées par le thread A?

Répondre

0

En plus de la réponse, note existante qui se passe-avant (X, Y) ne garantit que Y voit des mises à jour par X, et non pas que les autres threads voir les résultats de X avant que les résultats de Y.

(Dans En fait, vous n'avez pas besoin d'être à l'intérieur d'un bloc synchronisé pour avoir des relations successives entre des actions successives à l'intérieur d'un seul et même thread Voir le premier point du 17.4.5 dans le JLS.)

3

points est que le fil B devrait utiliser un bloc synchronisé aussi, la synchronisation sur le même moniteur en tant que fils A.

Si le fil B n'utilise pas la synchronisation, les changements peuvent être ou ne pas être vu.