ホームページ  >  記事  >  Java  >  JavaのAtomicクラスのAtomicBoolean

JavaのAtomicクラスのAtomicBoolean

(*-*)浩
(*-*)浩転載
2019-10-15 17:01:352697ブラウズ

JavaのAtomicクラスのAtomicBoolean

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 サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。