原子操作是在并发编程中指不可被中断的一个单一操作,它要么完全执行,要么完全不执行,不会被其他线程的干扰。原子操作可以确保数据的一致性和完整性,避免多线程并发访问时出现的竞态条件。
在 Java Concurrency API 中,提供了一些原子类(atomic classes) ,它们提供了一些常见操作的原子版本,可以保证在多线程环境下的安全性。以下是 Java Concurrency API 中常见的一些原子类:
- AtomicInteger: 提供了原子操作的整数类型,例如原子的增加、减少、比较和设置等操作。
- AtomicLong: 类似于
AtomicInteger,但是用于长整数类型。 - AtomicBoolean: 提供了原子操作的布尔类型。
- AtomicReference: 提供了原子操作的引用类型,用于管理引用对象的更新。
- AtomicReferenceArray: 与
AtomicReference类似,但是针对数组。 - AtomicIntegerFieldUpdater: 提供了原子化的更新操作,用于特定类的整数字段。
- AtomicLongFieldUpdater: 类似于
AtomicIntegerFieldUpdater,但是用于长整数字段。 - AtomicStampedReference: 在
AtomicReference的基础上增加了一个时间戳,用于解决 ABA 问题。 - AtomicMarkableReference: 与
AtomicStampedReference类似,但是使用布尔值来标记更新。
这些原子类提供了一种方式来避免显式地使用锁来保护共享资源。它们通过利用硬件级别的原子操作,能够在多线程环境下保证数据的一致性,避免了锁带来的性能开销和竞争条件。需要根据具体的需求选择合适的原子类,以确保多线程环境下数据的正确性。
1、原⼦操作是指⼀个不受其他操作影响的操作任务单元。原⼦操作是在多线程环境下避免数据不⼀致必须的⼿段。
2、int++并不是⼀个原⼦操作,所以当⼀个线程读取它的值并加1时,另外⼀个线程有可能会读到之前的值,这就会引发 错误。
3、为了解决这个问题,必须保证增加操作是原⼦的,在JDK1.5之前我们可以使⽤同步技术来做到这⼀点。 到JDK1.5,java.util.concurrent.atomic包提供了int和long类型的装类,它们可以⾃动的保证对于他们的操作是原⼦的并 且不需要使⽤同步。