线程学习记录05-原子类型

有如下代码:

public class VolatitleNoAtomic extends Thread {

private static volatile int count = 0 ;

private void addCount(){
    for (int i = 0; i < 1000; i++){
        count ++ ;
    }
    System.out.println(count);
}

@Override
public void run() {
    addCount();
}

public static void main(String[] args) {
    VolatitleNoAtomic[] arr = new VolatitleNoAtomic[10];
    for (int i = 0 ; i < 10 ; i++){
        arr[i] = new VolatitleNoAtomic();
    }
    for (int i = 0 ; i < 10 ; i++){
        arr[i].start();
    }
}
}

运行结果:

image.png

这里count已然加上了volatitle关键字修饰,但是产生的数据依旧是线程不安全的。这里说明volatile只是具有可见性,但是本身不具备原子性。在不使用synchronized同步机制或其他同步机制的情况下,可以使用原子数据类型本身可以有一个比较轻量的方式。要实现原子性,建议使用Atomic系列的类

修改后的代码:

public class VolatitleNoAtomic extends Thread {

//    private static volatile int count = 0 ;
  private static AtomicInteger count = new AtomicInteger(0) ;

private void addCount(){
    for (int i = 0; i < 1000; i++){
        count.incrementAndGet();
    }

    System.out.println(count);
}

@Override
public void run() {
    addCount();
}

public static void main(String[] args) {
    VolatitleNoAtomic[] arr = new VolatitleNoAtomic[10];
    for (int i = 0 ; i < 10 ; i++){
        arr[i] = new VolatitleNoAtomic();
    }
    for (int i = 0 ; i < 10 ; i++){
        arr[i].start();
    }
}
}

运行结果:

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容