Heim >Java >javaLernprogramm >AtomicBoolean der Atomic-Klasse in Java

AtomicBoolean der Atomic-Klasse in Java

(*-*)浩
(*-*)浩nach vorne
2019-10-15 17:01:352757Durchsuche

AtomicBoolean der Atomic-Klasse in Java

Klasse

Unter dem Paket java.util.concurrent.atomic gibt es AtomicBoolean, AtomicInteger, AtomicLong, AtomicReference und andere Klassen Das grundlegende Merkmal besteht darin, dass in einer Multithread-Umgebung die in diesen Klasseninstanzen enthaltenen Methoden exklusiv ausgeführt werden. Das heißt, wenn ein Thread die Methode betritt und die darin enthaltenen Anweisungen ausführt, wird er nicht von anderen Threads unterbrochen , und andere Threads drehen sich einfach. Genau wie die Sperre wartet sie, bis die Methode abgeschlossen ist, bevor die JVM einen anderen Thread aus der Warteschlange zum Betreten auswählt.

Beispiel

Nehmen Sie AtomicBoolean als Beispiel. Wenn ein einzelner Thread eine gewöhnliche Methode ausführt (wie folgt), gibt es kein Threading-Problem:

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();
    }
}

Wenn jedoch eine Multithread-Ausführung auftritt und der Befehl nach der Beurteilung ausgeführt wird, fügen andere Threads den Wert von Exits ein und ändern ihn. Zum Beispiel das folgende Codefragment:

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");
        }
    }
}

Führen Sie zwei Threads gleichzeitig aus und das gedruckte Ergebnis lautet:

张三,step 1
李四,step 1
张三,step 2
李四,step 2
张三,step 3
李四,step 3

Jetzt kann die Verwendung von AtomicBoolean einen sicheren Betrieb in Multithread-Situationen gewährleisten. und nur ein Thread wird für die Geschäftsverarbeitung verwendet.

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");
        }

    }
}

Wenn zwei Threads diese Klasse ausführen, lautet das gedruckte Ergebnis wie folgt:

张三,step else
李四,step 1
李四,step 2
李四,step 3

Testklasse:

package com.secbro.test.atomic;
/**
 * @author zhuzhisheng
 * @Description
 * @date on 2016/5/26.
 */
public class TestBoolean {
    public static void main(String[] args) {
        Thread thread1 = new Thread(new NormalBoolean2("李四"));
        Thread thread2 = new Thread(new NormalBoolean2("张三"));
        thread1.start();
        thread2.start();
        //-------------------------------------------------------
        Thread thread3 = new Thread(new TestAtomicBoolean("李四"));
        Thread thread4 = new Thread(new TestAtomicBoolean("张三"));
        thread3.start();
        thread4.start();
    }
}

Das obige ist der detaillierte Inhalt vonAtomicBoolean der Atomic-Klasse in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen