3.1 原子操作類AtomicInteger 的理解和使用

AtomicInteger 常用的幾個方法

int addAndGet(int delta):以原子方式將實例中的值與輸入的值delta相加,並返回結果

boolean compareAndSet(int expect, int update):如果輸入的值expect等於預期值,就以原子方式把值設置爲update

int getAndIncrement():以原子方式獲取值之後,增加1

int getAndSet(int newValue):以原子方式獲取當前值,然後設置一個值

多線程對普通變量int的修改:會有併發問題

public class MyAtomicInteger {
    int sum =0;

    public static void main(String[] args) throws InterruptedException {
        MyAtomicInteger myAtomicInteger = new MyAtomicInteger();
        for (int i = 0; i < 100; i++) {
            new Thread() {
                @Override
                public void run() {
                    int t = myAtomicInteger.sum;
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    myAtomicInteger.sum = 1 + t;
                }
            }.start();
        }
        Thread.sleep(1000);
        System.out.println(myAtomicInteger.sum);
    }
}

結果:6

對volatile變量修改:

public class MyAtomicInteger3 {
    volatile int sum =0;

    public static void main(String[] args) throws InterruptedException {
        MyAtomicInteger3 myAtomicInteger = new MyAtomicInteger3();
        for (int i = 0; i < 100; i++) {
            new Thread() {
                @Override
                public void run() {
                    int t = myAtomicInteger.sum;
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    myAtomicInteger.sum = 1 + t;
                }
            }.start();
        }
        Thread.sleep(1000);
        System.out.println(myAtomicInteger.sum);
    }
}

結果:4

使用AtomicInteger的變量:

public class MyAtomicInteger2 {
    AtomicInteger sum = new AtomicInteger(0);

    public static void main(String[] args) throws InterruptedException {
        MyAtomicInteger2 myAtomicInteger = new MyAtomicInteger2();
        for (int i = 0; i < 100; i++) {
            new Thread() {
                @Override
                public void run() {
                    int t = myAtomicInteger.sum.get();
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    myAtomicInteger.sum.incrementAndGet();
                }
            }.start();
        }
        Thread.sleep(1000);
        System.out.println(myAtomicInteger.sum.get());
    }
}

結果:100

AtomicInteger不僅操作簡單,並且能夠保證線程安全

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