//一家商店为了挽留客户决定为贵宾卡里小于20元的用户免费充值20
//但是一个用户只能被充值一次
//运行以下程序你会发现用户一旦卡上余额小于20就会被充值20元
//这与只充值一次不相符
//其原因就是账户余额被反复修改,修改后等于原来的值
//使得CAS无法判断当前数据状态
//AtomicReference是对对象的引用,而AtomicInteger是对整数的引用
import java.util.concurrent.atomic.*;
public class AtomicStampedReferenceDemo{
static AtomicReference<Integer> money = new AtomicReference<Integer>(19);
public static void main(String[] args) {
for(int i = 0;i<3;i++){
new Thread(){
public void run(){
while(true){
while(true){
Integer m = money.get();
if(m<20){
if(money.compareAndSet(m,m+20)){
System.out.println("账户余额小于20元,充值成功,余额:"+money.get()+"元");
break;
}
}else{
//System.out.println("余额大于20元,无需充值");
break;
}
}
}
}
}.start();
}
//模拟消费者
new Thread(){
public void run(){
for(int i = 0;i<100;i++){
while(true){
//获取当前值
Integer m = money.get();
if(m>10){
System.out.println("大于10元");
if(money.compareAndSet(m,m-10)){
System.out.println("成功消费10元,余额"+money.get());
break;
}
}else{
System.out.println("没有足够的金额");
break;
}
}
try{
Thread.sleep(100);
}catch(Exception e){
e.printStackTrace();
}
}
}
}.start();
}
}
AtomicReference
最新推荐文章于 2023-02-13 23:24:04 发布