Java中的Atomic包

Atomic包介绍

在Atomic包里一共有12个类,四种原子更新方式,分别是原子更新基本类型,原子更新数组,原子更新引用和原子更新字段。Atomic包里的类基本都是使用Unsafe实现的包装类。

原子更新基本类型类

用于通过原子的方式更新基本类型,Atomic包提供了以下三个类:

AtomicBoolean:原子更新布尔类型。

AtomicInteger:原子更新整型。

AtomicLong:原子更新长整型。

原子更新数组类

通过原子的方式更新数组里的某个元素,Atomic包提供了以下三个类:

· AtomicIntegerArray:原子更新整型数组里的元素。

· AtomicLongArray:原子更新长整型数组里的元素。

· AtomicReferenceArray:原子更新引用类型数组里的元素。

原子更新引用类型

原子更新基本类型的AtomicInteger,只能更新一个变量,如果要原子的更新多个变量,就需要使用这个原子更新引用类型提供的类。Atomic包提供了以下三个类:

· AtomicReference:原子更新引用类型。

· AtomicReferenceFieldUpdater:原子更新引用类型里的字段。

· AtomicMarkableReference:原子更新带有标记位的引用类型。可以原子的更新一个布尔类型的标记位和引用类型。构造方法是AtomicMarkableReference(V initialRef, boolean initialMark)

原子更新字段类

如果只需要某个类里的某个字段,那么就需要使用原子更新字段类,Atomic包提供了以下三个类:

· AtomicIntegerFieldUpdater:原子更新整型的字段的更新器。

· AtomicLongFieldUpdater:原子更新长整型字段的更新器。

· AtomicStampedReference:原子更新带有版本号的引用类型。该类将整数值与引用关联起来,可用于原子的更数据和数据的版本号,可以解决使用CAS进行原子更新时,可能出现的ABA问题。

原子更新字段类都是抽象类,每次使用都时候必须使用静态方法newUpdater创建一个更新器。原子更新类的字段的必须使用public volatile修饰符。AtomicIntegerFieldUpdater的例子代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class AtomicIntegerFieldUpdaterTest {

private static AtomicIntegerFieldUpdater<User> a = AtomicIntegerFieldUpdater
.newUpdater(User.class, "old");

public static void main(String[] args) {
User conan = new User("conan", 10);
System.out.println(a.getAndIncrement(conan));
System.out.println(a.get(conan));
}

public static class User {
private String name;
public volatile int old;

public User(String name, int old) {
this.name = name;
this.old = old;
}

public String getName() {
return name;
}

public int getOld() {
return old;
}
}
}