2011-09-20 3 views

Répondre

3

Je pense que c'est déjà garanti par l'API.

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CyclicBarrier.html

effets de cohérence de la mémoire: Actions dans un fil avant d'appeler await() se-avant actions qui font partie de l'action de barrière, qui, à son tour se-avant actions suite à un retour réussi à partir du wait() correspondant dans d'autres threads.

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html#MemoryVisibility

Les résultats d'une écriture par un fil sont garantis pour être visibles à une lecture par un autre thread que si l'opération d'écriture arrive-avant l'opération de lecture. ... Actions avant l'appel de CyclicBarrier.await effect-before actions effectuées par l'action de barrière, et les actions effectuées par l'action de barrière se produisent avant les actions suite à un retour réussi de l'attente correspondante dans d'autres threads.


Cela signifie

thread 1     thread 2 

write x1;     write x2 
barrier.await();   barrier.await(); 
read x2     read x1 

aucune synchronisation supplémentaire est nécessaire; read x2 verra le résultat de write x2

+0

oui, cela garantit l'ordre de fonctionnement, mais je n'ai vu aucun texte mentionnant le flush des valeurs de cache dans la mémoire (de sorte que les threads en attente verraient sûrement les résultats les uns des autres) - mon point est le mot-clé volatile est requis pour assurer que la valeur écrite sera partagée entre tous les threads en attente qui ont traversé la barrière –

+0

le * arrive-avant * est un terme technique ici; si 'write x2' * arrive-before *' read x2', la lecture verra l'effet de l'écriture. vous pouvez penser à cela comme «rinçage de la cache»; Cependant, le modèle de mémoire Java n'utilise plus les concepts de cache/flush. – irreputable

Questions connexes