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

AtomicBoolean der Atomic-Klasse in Java

(*-*)浩
Freigeben: 2019-10-15 17:01:35
nach vorne
2752 Leute haben es durchsucht

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();
    }
}
Nach dem Login kopieren

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");
        }
    }
}
Nach dem Login kopieren

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

张三,step 1
李四,step 1
张三,step 2
李四,step 2
张三,step 3
李四,step 3
Nach dem Login kopieren

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

    }
}
Nach dem Login kopieren

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

张三,step else
李四,step 1
李四,step 2
李四,step 3
Nach dem Login kopieren

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();
    }
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage