当我们使用多线程编程时,为了保证多线程程序的正确性和同步性,我们很常使用 Atomic 类型来进行操作。Atomic 类可以保证某个操作的原子性,避免数据竞争等问题。在Java中,Java.util.concurrent.atomic 包下提供了一些常见的 Atomic 类。接下来,我将会具体讲解这些 Atomic 类的使用方法和注意事项。
AtomicInteger
1. AtomicInteger 的定义
AtomicInteger 类用于支持在多线程并发访问下,一个或多个变量的原子性更新操作。当多个线程对同一个 Atomic 变量进行更新操作时,AtomicInteger 会自动加上锁,保证只有一个线程能修改共享变量。在 AtomicInteger 中,变量的值是通过 compareAndSet 方法来实现原子更新的。
public class AtomicInteger extends Number implements java.io.Serializable {
private volatile int value;
//.......
}
2. AtomicInteger 的方法
- int incrementAndGet()
对当前 Atomic 变量进行 自增操作,并获取自增后的值。该方法是原子性的,即在多线程访问情况下,仅有一个线程能够对变量进行更新操作,保证了共享变量的线程安全。
java
AtomicInteger atomicInteger = new AtomicInteger();
int incrVal = atomicInteger.incrementAndGet(); // 自增后的值
- int getAndIncrement()
获取当前 Atomic 变量的值,并将变量进行自增。该方法同样是原子性的,即在多线程访问情况下,仅有一个线程能够对变量进行更新操作,保证了共享变量的线程安全。
java
AtomicInteger atomicInteger = new AtomicInteger();
int origVal = atomicInteger.getAndIncrement(); // 获取值并自增
AtomicBoolean
1. AtomicBoolean 的定义
AtomicBoolean 是一个涉及到原子性操作的基本类型,用于在多线程访问下进行布尔变量的原子性操作。在 AtomicBoolean 中,被更新的变量是 boolean 类型的值, 同样是通过 compareAndSet 方法来实现原子更新的。
public class AtomicBoolean implements java.io.Serializable {
private volatile int value;
}
2. AtomicBoolean 的方法
- boolean get()
获取当前 Atomic 变量的值。
java
AtomicBoolean atomicBoolean = new AtomicBoolean();
boolean val = atomicBoolean.get(); // 获取值
- boolean compareAndSet(boolean expVal, boolean newVal)
原子性的更新当前 Atomic 变量的值。如果当前值是 expVal,那么就将当前值更新为 newVal,否则什么也不做。
java
AtomicBoolean atomicBoolean = new AtomicBoolean();
boolean expVal = false;
boolean newVal = true;
atomicBoolean.compareAndSet(expVal, newVal); // 只有值为false时才会更新为true
AtomicLong
1. AtomicLong 的定义
AtomicLong 用于在多线程访问下进行长整型变量的原子性操作。AtomicLong 同样支持多线程变量的原子性更新,以保证volatile long 变量的原子性。
public class AtomicLong extends Number implements java.io.Serializable {
private volatile long value;
//.......
}
2. AtomicLong 的方法
- long incrementAndGet()
对当前 Atomic 变量进行自增操作,并获取自增后的值。该方法是原子性的,即在多线程访问情况下,仅有一个线程能够对变量进行更新操作,保证了共享变量的线程安全。
java
AtomicLong atomicLong = new AtomicLong();
long incrVal = atomicLong.incrementAndGet(); // 获取自增后的值
- long getAndIncrement()
获取当前 Atomic 变量的值,并将变量进行自增。该方法同样是原子性的,即在多线程访问情况下,仅有一个线程能够对变量进行更新操作,保证了共享变量的线程安全。
java
AtomicLong atomicLong = new AtomicLong();
long origVal = atomicLong.getAndIncrement(); // 获取原值并自增
通过上述示例,我们可以看到 AtomicInteger,AtomicBoolean 和 AtomicLong 都是线程安全的基本数据类型。这些原子类提供了线程安全的原子性方法,能够保证在多线程环境下进行某项操作时不会出现问题,因此,在多线程编程中使用原子性类可以更好地保证线程安全。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:常见的Atomic类有哪些? - Python技术站