Il y a quelque chose qui me dérange avec le modèle de mémoire Java (si je comprends même tout correctement). S'il y a deux threads A et B, il n'y a aucune garantie que B verra jamais une valeur écrite par A, à moins que A et B ne se synchronisent sur le même moniteur.Le modèle de mémoire Java (JSR-133) implique-t-il que la saisie d'un moniteur entraîne le vidage du (des) cache (s) de données du processeur?
Pour toute architecture système garantissant la cohérence du cache entre les threads, il n'y a pas de problème. Mais si l'architecture ne prend pas en charge la cohérence du cache dans le matériel, cela signifie essentiellement que chaque fois qu'un thread entre dans un moniteur, toutes les modifications de mémoire effectuées précédemment doivent être validées dans la mémoire principale et le cache doit être invalidé. Et il doit être le cache de données complet, pas seulement quelques lignes, car le moniteur n'a aucune information quelles variables dans la mémoire il garde. Mais cela affecterait sûrement les performances de toute application devant être synchronisée fréquemment (en particulier les tâches telles que les files d'attente de travaux avec des tâches en cours d'exécution). Alors Java peut-il fonctionner raisonnablement bien sur des architectures sans cohérence de cache matériel? Si non, pourquoi le modèle de mémoire ne donne-t-il pas de meilleures garanties de visibilité? Ne serait-il pas plus efficace si le langage exigeait des informations ce qui est gardé par un moniteur? Comme je le vois le modèle de mémoire nous donne le pire des deux mondes, le besoin absolu de se synchroniser, même si la cohérence du cache est garantie dans le matériel, et d'autre part une mauvaise performance sur les architectures incohérentes. Donc, ne devrait-il pas être plus strict (exiger des informations ce qui est surveillé par un moniteur) ou plus perdre et limiter les plates-formes potentielles à des architectures cohérentes en cache?
Comme c'est le cas maintenant, cela n'a pas beaucoup de sens pour moi. Est-ce que quelqu'un peut éclaircir pourquoi ce modèle de mémoire spécifique a été choisi? EDIT: Mon utilisation de strict et de perdre était un mauvais choix en rétrospective. J'ai utilisé "strict" pour le cas où moins de garanties sont faites et "perdre" pour le contraire. Pour éviter toute confusion, il est probablement préférable de parler en termes de garanties plus fortes ou plus faibles.
Une chose qui doit être commentée est l'instruction "synchroniser sur le même moniteur". Si je comprends bien, la synchronisation sur le même moniteur garantit l'ordre d'exécution autour de ce moniteur. Cependant, en termes de mémoire cache, l'acquisition de _any_ bloc synchronisé force le rechargement du cache et la libération de _any_ lock force le vidage de toutes les écritures de la mémoire du CPU. – Gray
Quel arc spécifique aviez-vous en tête? – curiousguy