java

Java中AtomicInteger

2022-06-13  本文已影响0人  HachiLin

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. 参考

上一篇下一篇

猜你喜欢

热点阅读