Atomic类型组

原子类型。

在concurrent.atomic包中定义了若干原子类型,这些类型中的每个方法都是保证了原子操作的。多线程并发访问原子类型对象中的方法,不会出现数据错误。在多线程开发中,如果某数据需要多个线程同时操作,且要求计算原子性,可以考虑使用原子类型对象。
注意:原子类型中的方法是保证了原子操作,但多个方法之间是没有原子性的。如:

AtomicInteger i = new AtomicInteger(0);
if(i.get() != 5) i.incrementAndGet();

在上述代码中,get方法和incrementAndGet方法都是原子操作,但复合使用时,无法保证原子性,仍旧可能出现数据错误。
例:

  /**
 * AtomicXxx
 * 同步类型
 * 原子操作类型。 其中的每个方法都是原子操作。可以保证线程安全。
 */
package com.sxt.concurrent.t01;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

public class Test_11 {
    AtomicInteger count = new AtomicInteger(0);
    void m(){
        for(int i = 0; i < 10000; i++){
            /*if(count.get() < 1000)*/
                count.incrementAndGet();
        }
    }
    
    public static void main(String[] args) {
        final Test_11 t = new Test_11();
        List threads = new ArrayList<>();
        for(int i = 0; i < 10; i++){
            threads.add(new Thread(new Runnable() {
                @Override
                public void run() {
                    t.m();
                }
            }));
        }
        for(Thread thread : threads){
            thread.start();
        }
        for(Thread thread : threads){
            try {
                thread.join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        System.out.println(t.count.intValue());
    }
}

上述代码输出结果是 100000 ,如果将 AtomicInteger count = new AtomicInteger(0); 换成Integer 则会出现莫名的结果值。

你可能感兴趣的:(Atomic类型组)