Java中AtomicInteger

1. 介绍

  在Java语言中,++i和i++操作都不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。AtomicInteger,命名带有Atomic,很明显本身是原子性。这个类常是线程安全,多用于高并发对数据的修改。

2. 使用

  • 例子
import java.util.concurrent.atomic.AtomicInteger;
@Test
public void use AtomicInteger() {
    AtomicInteger integer = new AtomicInteger(0);
    System.out.println(integer.get());
    integer.set(1); 
    int i = integer.get(); //获得值
    System.out.println(i + "\n" + "------------------");

    integer.set(2);
    i = integer.incrementAndGet(); //先+1,然后在返回值,相当于++i
    System.out.println(i);
    i = integer.get();
    System.out.println(i + "\n" + "------------------");

    integer.set(3);
    i = integer.getAndIncrement(); //先返回值,然后在+1,相当于i++
    System.out.println(i);
    i = integer.get();
    System.out.println(i + "\n" + "------------------");

    integer.set(4);
    i = integer.decrementAndGet();//先-1,然后在返回值,相当于--i
    System.out.println(i);
    i = integer.get();
    System.out.println(i + "\n" + "------------------");

    integer.set(5);
    i = integer.getAndDecrement();//先返回值,然后在-1,相当于i--
    System.out.println(i);
    i = integer.get();
    System.out.println(i + "\n" + "------------------");

    integer.set(6);
    i = integer.addAndGet(1); //先+n,然后在返回值,
    System.out.println(i);
    i = integer.get();
    System.out.println(i + "\n" + "------------------");

    integer.set(7);
    i = integer.getAndAdd(1); //先返回,然后+n
    System.out.println(i);
    i = integer.get();
    System.out.println(i + "\n" + "------------------");
}
  • 输出
0
1
------------------
3
3
------------------
3
4
------------------
3
3
------------------
5
4
------------------
7
7
------------------
7
8
------------------

3. 原子性例子

public class TestAtomicInteger {
    static int i = 0;
    static AtomicInteger a=new AtomicInteger(0);
    static class MyThread implements Runnable {
         synchronized public void run() {
            for (int m = 0; m < 1000; m++) {
                a.getAndIncrement();
                   i++;
            }
        }
    };

    public static void main(String[] args) throws Exception {
          MyThread m = new MyThread();
          Thread t1 = new Thread(m);
          Thread t2 = new Thread(m);
          t1.start();
          t2.start();
          System.out.println(i);
          System.out.println(a.get());
    }
}
  • 输出
加synchronized 输出结果
2000
2000
不加synchronized 输出结果
1986
2000

4. 参考

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

推荐阅读更多精彩内容

  • 1. HashMap原理 jdk8后采用数组+链表+红黑树的数据结构,利用元素的key的hash值对数组长度取模得...
    谷哥得小弟阅读 928评论 0 0
  • 全栈知识点 关键字: synchronized详解 | Java 全栈知识体系[https://pdai.tech...
    puddingJava阅读 243评论 0 0
  • 本文大纲 1.并发编程三要素 原子性原子,即一个不可再被分割的颗粒。在Java中原子性指的是一个或多个操作要么全部...
    _SOLID阅读 15,085评论 6 39
  • 杂碎知识点1 大四开始找工作后遇到的面试题进行汇总,因为之前记录的都是在有道云中,复制到简书出现格式的问题,大致修...
    秋写云上阅读 444评论 0 0
  • Java四大特性,多态存在的条件抽象、继承、封装、多态继承 + 重写 + 父类引用指向子类对象 Java对象的完整...
    tt2019阅读 249评论 0 0