Maison >Java >javaDidacticiel >Modèle de mémoire Java et visibilité : examen plus approfondi de la cohérence des données dans la programmation multithread
l'éditeur php Xigua vous amènera à explorer en profondeur le modèle et la visibilité de la mémoire Java, et à analyser les problèmes de cohérence des données dans la programmation multithread. Dans un environnement multithread, la visibilité des données est essentielle à l'exactitude du programme. En analysant en profondeur le modèle de mémoire Java, nous pouvons mieux comprendre le mécanisme d'interaction des données dans la programmation multithread, évitant ainsi des problèmes inattendus. Dans cet article, nous aborderons les problèmes clés de la programmation multithread pour aider les lecteurs à mieux comprendre et appliquer les connaissances pertinentes du modèle de mémoire Java.
La visibilité signifie que les modifications apportées aux variables partagées par un thread peuvent être immédiatement vues par les autres threads. Dans JMM, la visibilité est obtenue grâce aux barrières de mémoire. Une barrière de mémoire est une instruction spéciale qui oblige la JVM à vider le cache avant ou après avoir effectué des opérations de mémoire.
public class VisibilityDemo { private int sharedVar = 0; public void writerThread() { sharedVar = 42; } public void readerThread() { int localVar = sharedVar; // 可能读取到旧值 System.out.println("Reader thread: " + localVar); } public static void main(String[] args) { VisibilityDemo demo = new VisibilityDemo(); Thread writer = new Thread(demo::writerThread); Thread reader = new Thread(demo::readerThread); writer.start(); reader.start(); writer.join(); reader.join(); } }
Dans l'exemple ci-dessus, une barrière mémoire est insérée entre writerThread
和 readerThread
同时访问共享变量 sharedVar
。如果没有内存屏障,readerThread
可能会读取到旧的 sharedVar
值,导致程序输出错误的结果。为了解决这个问题,可以在 writerThread
和 readerThread
.
public class VisibilityDemoWithMemoryBarrier { private int sharedVar = 0; public void writerThread() { // 插入内存屏障 synchronized (this) {} sharedVar = 42; } public void readerThread() { // 插入内存屏障 synchronized (this) {} int localVar = sharedVar; System.out.println("Reader thread: " + localVar); } public static void main(String[] args) { VisibilityDemoWithMemoryBarrier demo = new VisibilityDemoWithMemoryBarrier(); Thread writer = new Thread(demo::writerThread); Thread reader = new Thread(demo::readerThread); writer.start(); reader.start(); writer.join(); reader.join(); } }
Dans l'exemple ci-dessus, nous avons modifié writerThread
和 readerThread
之间插入了内存屏障(通过调用 synchronized
方法)。这样,readerThread
就能够立即看到 writerThread
对 sharedVar
et il n'y aura pas de mauvais résultats.
L'atomicité signifie qu'une opération est soit complètement exécutée, soit pas exécutée du tout. Dans JMM, l'atomicité est obtenue grâce à des variables atomiques et des opérations atomiques (atomic operation).
La variable atomique est une variable spéciale à laquelle un seul thread à la fois peut accéder. Une opération atomique est une opération spéciale qui peut être effectuée sans interruption.
import java.util.concurrent.atomic.AtomicInteger; public class AtomicityDemo { private AtomicInteger sharedVar = new AtomicInteger(0); public void incrementSharedVar() { sharedVar.incrementAndGet(); } public static void main(String[] args) { AtomicityDemo demo = new AtomicityDemo(); Thread[] threads = new Thread[10]; for (int i = 0; i < threads.length; i++) { threads[i] = new Thread(demo::incrementSharedVar); } for (Thread thread : threads) { thread.start(); } for (Thread thread : threads) { thread.join(); } System.out.println("Final value of sharedVar: " + demo.sharedVar.get()); } }
Dans l'exemple ci-dessus, nous avons utilisé des variables atomiques sharedVar
来确保多个线程对 sharedVar
的修改是原子的。即使有多个线程同时修改 sharedVar
et le résultat final est également correct.
JMM est largement utilisé dans la programmation multithread, telle que :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!