菜鸟笔记
提升您的技术认知

cas基本原理-ag真人游戏

阅读 : 317

什么是原子性

原子不可分割(在还未发现原子核与电子时)。
假设有两个线程,从一个线程看,另一个线程要么全部执行完,要么不执行,那么连个线程彼此具有原子性。
实现原子操作可以使用锁,锁机制就可以满足基本问题了,但是我们需求没有那么简单,我们需要更效率更灵活的机制。

问题:如果大量线程来竞争资源,那么cpu将花费大量的时间和资源来处理这些竞争

实现原子操作还可以使用当前处理器都支持cas的指令
每一个cas指令的操作过程包含三个运算符:内存地址v,期望值a,新值b,如果这个内存地址存放的值等于期望值a,则将地址上的值赋予新值b,否则不做任何操作。
循环cas不断的执行cas操作,直到成功为止

cas的三大问题

1.aba问题
2.循环时间长开销大
3.只能保证一个共享变量的原则操作
atomicreference 可以把多个变量放在一个对象中进行操作

jdk中相关原子操作类

atomicinteger

    /**
     * 以原子方式将给定值添加到当前值。
     * 返回结果
     */
    public final int addandget(int delta){
        return u.getandaddint(this, value, delta)   delta;
    }
    /**
     * 如果当前值是期望值,则以原子方式将该值设置为给定的更新值。
     */
    public final boolean compareandset(int expect, int update) {
        return u.compareandswapint(this, value, expect, update);
    }
    /**
     * 以原子方式将当前值增加一
     * 返回自增前的值
     */
    public final int getandincrement() {
        return u.getandaddint(this, value, 1);
    }
    /**
     * 以原子方式设置为给定值
     *返回旧值
     */
    public final int getandset(int newvalue) {
        return u.getandsetint(this, value, newvalue);
    }

atomicintegerarray

    /**
     * 对内部数组进行修改,不会影响传入的数组
     */
    public atomicintegerarray(int[] array) {
        // visibility guaranteed by final field guarantees
        this.array = array.clone();
    }
    /**
     * 以原子方式将给定值添加到索引为 i的元素。
     * 返回更新后的值
     */
    public final int addandget(int i, int delta) {
        return getandadd(i, delta)   delta;
    }
    /**
     * 如果当前值是期望值,则以原子方式将索引 i的元素设置为给定的更新值。
     */
    public final boolean compareandset(int i, int expect, int update) {
        return compareandsetraw(checkedbyteoffset(i), expect, update);
    }

atomicreference
atomicstampedreference
以版本戳的形式记录了每次改变以后的版本号,解决了aba问题
atomicmarkablereference
与atomicstampedreference相似,
atomicstampedreference记录的修改次数;
atomicmarkablereference记录是否修改过。

网站地图