Maison >Java >javaDidacticiel >Explication détaillée des scénarios d'utilisation et des fonctions du mot clé volatile en Java
Explication détaillée du rôle et des scénarios d'application du mot-clé volatile en Java
1 Le rôle du mot-clé volatile
En Java, le mot-clé volatile est utilisé pour identifier une variable visible entre plusieurs threads, c'est-à-dire. , pour assurer la visibilité. Plus précisément, lorsqu'une variable est déclarée volatile, toute modification apportée à la variable est immédiatement connue des autres threads.
2. Scénarios d'application du mot-clé volatile
public class FlagThread { private volatile boolean running = true; public void setRunning(boolean running) { this.running = running; } public void run() { while (running) { // 执行任务 } // 停止执行 } public static void main(String[] args) { FlagThread thread = new FlagThread(); thread.start(); // 模拟运行一段时间后停止执行 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } thread.setRunning(false); } }
Dans le code ci-dessus, la variable en cours d'exécution dans la classe FlagThread est déclarée volatile. Lorsque le thread principal définit l'exécution sur false, le thread FlagThread le détecte immédiatement et arrête l'exécution.
public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
Dans le code ci-dessus, la variable d'instance est déclarée volatile. En effet, dans un environnement multithread, si le mot clé volatile n'est pas utilisé, en raison du problème de réorganisation des instructions, lorsque plusieurs threads accèdent à la méthode getInstance en même temps, l'instance renvoyée n'est pas un objet entièrement initialisé.
public class SharedData { private volatile int data; public int getData() { return data; } public void setData(int data) { this.data = data; } } public class Producer implements Runnable { private SharedData sharedData; public Producer(SharedData sharedData) { this.sharedData = sharedData; } @Override public void run() { int value = 0; while (true) { sharedData.setData(value); value++; } } } public class Consumer implements Runnable { private SharedData sharedData; public Consumer(SharedData sharedData) { this.sharedData = sharedData; } @Override public void run() { while (true) { int value = sharedData.getData(); System.out.println(value); } } } public class Main { public static void main(String[] args) { SharedData sharedData = new SharedData(); Thread producerThread = new Thread(new Producer(sharedData)); Thread consumerThread = new Thread(new Consumer(sharedData)); producerThread.start(); consumerThread.start(); } }
Dans le code ci-dessus, le thread producteur écrit en continu des données dans la variable de données de l'objet sharedData, tandis que le thread consommateur lit en continu les données de la variable de données. Étant donné que la variable de données est déclarée volatile, l'opération d'écriture du thread producteur dans les données est visible pour le thread consommateur.
3. Résumé
Le mot-clé volatile joue un rôle important dans la programmation multithread Java. Il est utilisé pour assurer la visibilité des variables. Dans certains scénarios, nous devons nous assurer que les modifications apportées aux variables entre plusieurs threads sont visibles par les autres threads. Dans ce cas, le mot-clé volatile peut être utilisé. Cependant, il convient de noter que le mot-clé volatile ne peut garantir que la visibilité, mais pas l'atomicité des variables. Si vous devez garantir l'atomicité, vous pouvez envisager d'utiliser le mot-clé synchronisé ou la classe Atomic.
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!