Je ne vais pas tenter de répondre à vos questions ici - je vais plutôt vous rediriger vers le livre que j'ai vu recommandé pour des conseils sur ce sujet : Java Concurrency en pratique .
Un mot d'avertissement : s'il y a sont réponses ici, attendez-vous à ce que beaucoup d'entre elles soient fausses. L'une des raisons pour lesquelles je ne vais pas poster les détails est que je suis presque sûr que Je se trompent au moins sur certains points. Je ne veux absolument pas manquer de respect à la communauté en disant que les chances que tous ceux qui pensent pouvoir répondre à cette question aient suffisamment de rigueur pour y parvenir sont pratiquement nulles. (Joe Duffy a récemment trouvé une partie du modèle de mémoire de .NET qui l'a surpris. S'il peut se tromper, les mortels comme nous le peuvent aussi).
Je vais vous donner un aperçu d'un seul aspect, car il est souvent mal compris :
Il y a une différence entre la volatilité et l'atomicité. Les gens pensent souvent qu'une écriture atomique est volatile (c'est-à-dire que vous n'avez pas besoin de vous soucier du modèle de mémoire si l'écriture est atomique). Ce n'est pas le cas.
La volatilité consiste à savoir si un thread effectuant une lecture (logiquement, dans le code source) "verra" les modifications apportées par un autre thread.
L'atomicité consiste à savoir s'il y a une chance que si un changement es vu, seule une partie du changement sera visible.
Par exemple, prenons l'écriture dans un champ de nombres entiers. Cette écriture est garantie comme étant atomique, mais pas volatile. Cela signifie que si nous avons (à partir de foo.x = 0) :
Thread 1: foo.x = 257;
Thread 2: int y = foo.x;
Il est possible pour y
doit être 0 ou 257. Ce ne sera pas une autre valeur (par exemple 256 ou 1) en raison de la contrainte d'atomicité. Cependant, même si vous savez que dans le "wall time", le code du thread 2 a été exécuté après le code du thread 1, il peut y avoir une mise en cache bizarre, des accès mémoire qui "bougent", etc. En rendant la variable x
volatile va régler ce problème.
Je laisse le reste aux vrais experts.