并发编程 CAS

105 阅读2分钟

一谈到并发编程,就会遇到各种概念,为什么会这么多概念呢,因为并发编程中的东西,是更贴近底层的东西,而底层很多都是java通过native去调用的,所以,并发编程一定是很多概念的东西,因为他里面很多的知识都是通过包装的API来进行调用的,这样就无法从表面上了解其原理,下面就说说并发编程的CAS

先看下CAS中的方法

 * Atomically sets synchronization state to the given updated
 * value if the current state value equals the expected value.
 * This operation has memory semantics of a {@code volatile} read
 * and write.
 *
 * @param expect the expected value
 * @param update the new value
 * @return {@code true} if successful. False return indicates that the actual
 *         value was not equal to the expected value.
 */
protected final boolean compareAndSetState(int expect, int update) {
    // See below for intrinsics setup to support this
    return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}

我们看到CAS其实他是委托unsafe来处理的,这个方法的意思就是他是原子性的 并且他是把当前的值和内存中的值进行比较如果和内存中的值相同的化,那么就可以进行读和写,那分析以下几点

  1. Unsafe 类的作用

    他的作用通过获取内存中对象的偏移量来确定对象的值

stateOffset = unsafe.objectFieldOffset (AbstractQueuedSynchronizer.class.getDeclaredField("state")); 这段代码就是他进行获取的过程

顺便说说,正常jvm如果要操作系统,那么是通过native进行了,但是unsafe不通,他是jvm直接操作操作系统的,所以是硬件级别的,很快

2 对CAS的理解

这个在源码中方法的注释上已经说明了,其实CAS是一个简写,全名是Compare and Swap意思是比较并转换。

3 什么是ABA问题

就是,如果我们通过CAS来判断一个变量有没有修改过,会存在不准确的情况,比如A值,被修改成B值,然后又被修改成A值,我们用CAS去判断,入参是A,期望值也是A,那么就会误以为,他没有被修改过,这是存在问题的,解决这个问题,最好还是通过锁来实现。

4 CAS的实现有什么

AtomicInteger类,这其中也有用到volitate。