《Java 併發編程》Atomic原子類

前言

併發的情況下,非常多的操作都存在併發問題。

原理

程序目的爲:run裏面的部分代碼只執行一遍

public class LockDemo14 implements Runnable {

    public static boolean flag = false;

    public static void main(String[] args) {

        Thread thread1 = new Thread(new LockDemo14());
        Thread thread2 = new Thread(new LockDemo14());
        Thread thread3 = new Thread(new LockDemo14());
        Thread thread4 = new Thread(new LockDemo14());
        Thread thread5 = new Thread(new LockDemo14());

        thread1.start();
        thread2.start();
        thread3.start();
        thread4.start();
        thread5.start();

    }

    @Override
    public void run() {
        if(flag == false){
            flag = true;
            System.out.println("執行run方法");
        }
    }
}

運行結果:爲了效果明顯可以打斷點

爲了不出現上面的情況,一種簡單方式就是加鎖,今天不討論加鎖,今天我們使用原子類(AtomicBoolean)。

public class LockDemo14 implements Runnable {

    public static AtomicBoolean flag = new AtomicBoolean(false);

    public static void main(String[] args) {
        Thread thread1 = new Thread(new LockDemo14());
        Thread thread2 = new Thread(new LockDemo14());
        Thread thread3 = new Thread(new LockDemo14());
        Thread thread4 = new Thread(new LockDemo14());
        Thread thread5 = new Thread(new LockDemo14());

        thread1.start();
        thread2.start();
        thread3.start();
        thread4.start();
        thread5.start();
    }

    @Override
    public void run() {
        if(flag.compareAndSet(false,true)){
            System.out.println("執行run方法");
        }
    }
}

運行結果:

很完美的解決了我的問題。

擴展

JDK還給我們提供了很多類似的原子類(AtomicInteger,AtomicLong等等),都在concurrent.atomic下。

總結

原子類對比鎖的優勢,減少阻塞,操作方便。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章