JAVA面试题 CAS算法 程序实现

在这里插入图片描述

又加入了version,防止多次修改后,期望值和多次修改后的值相同,被误判为无修改。

出现修改失败的原因:
线程1执行getV,getversion后,线程2执行getv,getversion,线程1在执行修改,修改成功,v(也可能多次修改后值相同)和version均改变,线程2执行修改方法,返回flase

线程1getV,线程二执行完三个方法,线程1执行getversion,出现v未改变,version改变了
所以两周要同时要求相同

package week3.day13;
import java.util.Random;

/**
 * 2020/8/6
 * 12:23
 * zmx
 */
public class TestCas {
    public static void main(String[] args) {
        Cas cas=new Cas();
        for (int i = 0; i < 10; i++) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        for(;;) {//无线循环,保证都能修改成功
                            int e=cas.getV();
                            int version=cas.getVersion();
                            boolean b=cas.compareandswap(e,new Random().nextInt(100),version);
                            if(b){
                                System.out.println("修改成功"+Thread.currentThread().getName());
                                break;
                            }else {
                                System.out.println("修改失败"+ Thread.currentThread().getName());
                            }
                        }
                    }
                }).start();
            }

    }
}
class Cas{
    private int v;
    private int version;

    public synchronized int getV() {
        return v;
    }

    public synchronized int getVersion() {
        return version;
    }
    public synchronized boolean compareandswap(int e,int n,int version){
        if(e==v&&this.version==version){//比较期望值与要更新的变量+版本
            this.version++;
            this.v=n;
            return true;
        }
        return false;
    }
}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值