对象的属性修改原子类
AtomicIntegerFieldUpdater
:原子更新对象中int类型字段的值AtomicLongFieldUpdater
:原子更新对象中Long类型字段的值AtomicReferenceFieldUpdater
:原子更新对象中引用类型字段的值
使用目的:
以一种线程安全的方式操作非线程安全对象内的某些字段
AtomicIntegerFieldUpdater使用案例
package com.nanjing.gulimall.zhouyimo.test;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
/**
* @author zhou
* @version 1.0
* @date 2024/1/16 10:48 下午
*/
public class AtomicIntegerFieldUpdaterDemo {
public static void main(String[] args) throws InterruptedException {
BankAccount bankAccount = new BankAccount();
CountDownLatch countDownLatch = new CountDownLatch(10);
for (int i = 1; i <= 10; i++) {
new Thread(() -> {
try {
for (int j = 1; j <= 1000; j++) {
bankAccount.transferMoney(bankAccount);
}
} finally {
countDownLatch.countDown();
}
}, String.valueOf(i)).start();
}
countDownLatch.await();
System.out.println(Thread.currentThread().getName() + '\t' + "result: " + bankAccount.money); //main result: 10000
}
}
class BankAccount {
//更新的对象属性必须使用volible关键字修饰
public volatile int money = 0;
//因为对象的属性修改类型的原子类都是抽象类,所以每次使用都必须使用newUpdater方法创建一个更新器,并且需要设置想要更新的类和属性
AtomicIntegerFieldUpdater<BankAccount> atomicIntegerFieldUpdater =
AtomicIntegerFieldUpdater.newUpdater(BankAccount.class, "money");
public void transferMoney(BankAccount bankAccount) {
atomicIntegerFieldUpdater.getAndIncrement(bankAccount);
}
}