它是个抽象类,具体由AtomicIntegerFiledUpdaterImpl来实现。
注意:它更新的必须是int类型,不能为Integer类型,也不能为static的,必须是volatile类型的。
一、底层实现:CAS.也就是Unsafe类的compareAndSwapInt(obj, offset, expect, update)方法
二、示例
1、定义包含要更新的对象的类,其中的int字段要定义为** volatile**类型。
package cn.edu.tju.controller;
public class Rate {
private int id;
private String item;
public volatile int score;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getItem() {
return item;
}
public void setItem(String item) {
this.item = item;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
2、定义主类,并在多线程的环境中使用AtomicIntegerFiledUpdater对上述类的对象进行并发更新
package cn.edu.tju.controller;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
/**
* @Author Amadeus Liu
* @Date 2022-05-07
*/
public class FiledUpdaterTestInMultiThread {
private static Rate rate=new Rate();
static {
rate.setItem("ability");
rate.setScore(0);
}
public static void main(String[] args) throws Exception{
Thread t1=new Thread(new MyDiyFieldUpdater("t1"));
Thread t2=new Thread(new MyDiyFieldUpdater("t2"));
Thread t3=new Thread(new MyDiyFieldUpdater("t3"));
t1.start();
t2.start();
t3.start();
t1.join();
t2.join();
t3.join();
System.out.println(rate.getScore());
}
static class MyDiyFieldUpdater implements Runnable{
private String name;
public MyDiyFieldUpdater(String name){
this.name=name;
}
@Override
public void run() {
AtomicIntegerFieldUpdater<Rate> updater=
AtomicIntegerFieldUpdater.newUpdater(Rate.class,"score");
for(int i=0;i<100;i++){
while(true){
int currentValue=rate.getScore();
int newValue=currentValue+1;
if(updater.compareAndSet(rate,currentValue,newValue)==true){
System.out.println(name+" updated value......");
break;
}
}
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
还有类似功能的2个类: AtomicLongFieldUpdater、 AtomicReferenceFieldUpdater.