Java并发编程之原子操作类

原子操作基本类

AtomicBoolean:原子更新布尔类型。

AtomicInteger:原子更新整型。

AtomicLong:原子更新长整型。

 

AtomicInteger:

int addAndGet(int delta):以原子方式将输入的数值与实例中的值(AtomicInteger里的

value)相加,并返回结果。

boolean compareAndSet(int expect,int update):如果输入的数值等于预期值,则以原子方式将该值设置为输入的值。

int getAndIncrement():以原子方式将当前值加1,注意,这里返回的是自增前的值。

void lazySet(int newValue):最终会设置成newValue,使用lazySet设置值后,可能导致其他线程在之后的一小段时间内还是可以读到旧的值。

int getAndSet(int newValue):以原子方式设置为newValue的值,并返回旧值。

原子数组操作

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

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

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

AtomicIntegerArray类主要是提供原子的方式更新数组里的整型

 

AtomicIntegerArray:

int addAndGet(int i,int delta):以原子方式将输入值与数组中索引i的元素相加。

boolean compareAndSet(int i,int expect,int update):如果当前值等于预期值,则以原子

方式将数组位置i的元素设置成update值。

 

原子引用操作

AtomicReference:原子更新引用类型。

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

AtomicMarkableReference:原子更新带有标记位的引用类型。可以原子更新一个布尔类

型的标记位和引用类型.构造方法是AtomicMarkableReference(V initialRef,boolean

initialMark)。

例1:

public static AtomicReference<User> atomicUserRef = new AtomicReference<User>();

public static void main(String[] args) {

User updateUser= new User("conan", 15);

User user=atomicUserRef.get();

atomicUserRef.compareAndSet(user, updateUser);

}

例2:
 

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(getAndIncrement(conan));

System.out.println(a.get(conan));

}

例3:

private static AtomicMarkableReference<Integer> a=new AtomicMarkableReference<Integer>(1, false);

public static void main(String[] args) {

System.out.println(a.compareAndSet(1, 2, false, true));

}

原子更新字段类

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

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

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

猜你喜欢

转载自blog.csdn.net/weixin_44416039/article/details/86160627