この記事では、Java 同時プログラミングの volatile キーワードについて説明します (例を示します)。必要な方は参考にしていただければ幸いです。
volatile キーワードの役割は、変数が複数のスレッドで表示されることです。 volatile キーワードはアトミックではありません
アトミック操作を実装したい場合は、アトミック クラスの一連のオブジェクトを使用することをお勧めします。アトミック操作をサポートします (アトミック クラスは保証するだけであることに注意してください)独自のメソッドのアトミック性であり、操作のアトミック性を複数回保証するものではありません)
1. volatile :
説明: Java では、各スレッドには作業メモリ領域があり、すべてのスレッドで共有される情報がメイン メモリに保存されます。スレッドが実行されると、これらの変数は独自の作業メモリ領域で操作されます。共有変数にアクセスするには、通常、スレッドはまずロックを取得して現在のスレッドのメモリ作業領域をクリアし、これらの共有変数をすべてのスレッドの共有メモリ領域から独自の作業メモリ領域に正しくロードします。スレッドのロックを解除すると、作業メモリ内の変数の値が共有メモリ領域に書き込まれます。
#* スレッドが実行できる操作は、使用 (use)、割り当て (assgin)、ロード (load)、ストア (store)、ロック (lock)、ロック解除 (ロック解除) です。 ) ;
public class RunThread extends Thread{ private volatile boolean isRunning = true; private void setRunning(boolean isRunning){ this.isRunning = isRunning; } public void run(){ System.out.println("进入run方法.."); int i = 0; while(isRunning == true){ //.. } System.out.println("线程停止"); } public static void main(String[] args) throws InterruptedException { RunThread rt = new RunThread(); rt.start(); Thread.sleep(1000); rt.setRunning(false); System.out.println("isRunning的值已经被设置了false"); } }
説明: volatile キーワードには可視性のみがあり、原子性はありません。
import java.util.concurrent.atomic.AtomicInteger; /** * volatile关键字不具备synchronized关键字的原子性(同步) * @@author Maozw * */ public class VolatileNoAtomic extends Thread{ //private static volatile int count; private static AtomicInteger count = new AtomicInteger(0); private static void addCount(){ for (int i = 0; i < 1000; i++) { //count++ ; count.incrementAndGet(); } System.out.println(count); } public void run(){ addCount(); } public static void main(String[] args) { VolatileNoAtomic[] arr = new VolatileNoAtomic[100]; for (int i = 0; i < 10; i++) { arr[i] = new VolatileNoAtomic(); } for (int i = 0; i < 10; i++) { arr[i].start(); } } }
* アトミック操作を実装したい場合は、アトミック クラスの一連のオブジェクトを使用することをお勧めします。アトミック操作をサポートします (アトミック クラスは、アトミック クラスのアトミック性のみを保証することに注意してください)独自のメソッドであり、複数の操作の原子性は保証されません)
例:
import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; public class AtomicUse { private static AtomicInteger count = new AtomicInteger(0); //多个addAndGet在一个方法内是非原子性的,需要加synchronized进行修饰,保证4个addAndGet整体原子性 /**synchronized*/ public synchronized int multiAdd(){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } count.addAndGet(1); count.addAndGet(2); count.addAndGet(3); count.addAndGet(4); //+10 return count.get(); } public static void main(String[] args) { final AtomicUse au = new AtomicUse(); List<Thread> ts = new ArrayList<Thread>(); for (int i = 0; i < 100; i++) { ts.add(new Thread(new Runnable() { @Override public void run() { System.out.println(au.multiAdd()); } })); } for(Thread t : ts){ t.start(); } } }
以上がJava 並行プログラミングの volatile キーワードの概要 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。