Class
java.util.concurrent.atomic パッケージの下には、AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference などのクラスがあります。基本的な特徴は、マルチスレッド環境では、これらのクラス インスタンスに含まれるメソッドの実行が排他的であること、つまり、スレッドがメソッドに入り、その中の命令を実行するときに、他のスレッドによって中断されないことです。ロックと同様に、メソッドの実行が完了するまで待機してから、JVM は待機キューから別のスレッドを選択して入力します。
例
AtomicBoolean を例として、単一のスレッドが通常のメソッド (次のように) を実行する場合、スレッドの問題は発生しません。 ## ただし、マルチスレッド実行が発生した場合、判定後のコマンドを実行すると、他のスレッドがexitの値を挿入・変更してしまいます。次のコード スニペットに示すように:
package com.secbro.test.atomic; /** * @author zhuzhisheng * @Description * @date on 2016/5/26. */ public class NormalBoolean implements Runnable{ public static boolean exits = false; private String name; public NormalBoolean(String name){ this.name = name; } @Override public void run() { if(!exits){ exits = true; System.out.println(name + ",step 1"); System.out.println(name + ",step 2"); System.out.println(name + ",step 3"); exits = false; } else { System.out.println(name + ",step else"); } } public static void main(String[] args) { new NormalBoolean("张三").run(); } }
2 つのスレッドを同時に実行すると、出力される結果は次のようになります:
package com.secbro.test.atomic; /** * @author zhuzhisheng * @Description * @date on 2016/5/26. */ public class NormalBoolean2 implements Runnable{ public static boolean exits = false; private String name; public NormalBoolean2(String name) { this.name = name; } @Override public void run() { if(!exits){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } exits = true; System.out.println(name + ",step 1"); System.out.println(name + ",step 2"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(name + ",step 3"); exits = false; } else { System.out.println(name + ",step else"); } } }
AtomicBoolean を使用すると、マルチスレッド状況での安全な操作が保証されます。また、業務処理に使用されるスレッドは 1 つだけです。
张三,step 1 李四,step 1 张三,step 2 李四,step 2 张三,step 3 李四,step 3
2 つのスレッドがこのクラスを実行すると、出力される結果は次のようになります:
package com.secbro.test.atomic; import java.util.concurrent.atomic.AtomicBoolean; /** * @author zhuzhisheng * @Description * @date on 2016/5/26. */ public class TestAtomicBoolean implements Runnable{ public static AtomicBoolean exits = new AtomicBoolean(false); private String name; public TestAtomicBoolean(String name) { this.name = name; } @Override public void run() { if(exits.compareAndSet(false,true)){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(name + ",step 1"); System.out.println(name + ",step 2"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(name + ",step 3"); exits.set(false); } else { System.out.println(name + ",step else"); } } }
テスト クラス:
张三,step else 李四,step 1 李四,step 2 李四,step 3
以上がJavaのAtomicクラスのAtomicBooleanの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。