Java における volatile キーワードの役割と適用シナリオの詳細な説明
1. volatile キーワードの役割
Java では、volatile キーワードは次のとおりです。変数を識別するために使用されます。変数は複数のスレッドにわたって可視です。つまり、可視性が保証されています。具体的には、変数が volatile と宣言されると、その変数への変更は他のスレッドに即座に知られます。
2. 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); } }
上記のコードでは、FlagThread クラスの実行変数は volatile として宣言されています。メインスレッドが running を false に設定すると、FlagThread スレッドは直ちにそれを感知し、実行を停止します。
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; } }上記のコードでは、インスタンス変数は volatile として宣言されています。これは、マルチスレッド環境で volatile キーワードが使用されていない場合、命令の並べ替えの問題により、複数のスレッドが同時に getInstance メソッドにアクセスすると、返されるインスタンスが完全に初期化されたオブジェクトではないためです。
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(); } }上記のコードでは、プロデューサー スレッドは、sharedData オブジェクトのデータ変数にデータを継続的に書き込み、コンシューマー スレッドは、データ変数からデータを継続的に読み取ります。データ変数は揮発性として宣言されているため、プロデューサー スレッドのデータへの書き込み操作はコンシューマー スレッドから認識されます。
3. 概要
以上がJavaのvolatileキーワードの使用シナリオと機能の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。