并发-CAS原则

转载:并发-CAS原则

1.java内存模型图:


java内存模型图

每个线程单独有一份来自内存的变量拷贝,彼此之间的操作是不可见的。一般情况下,都是在缓存中读取它们所用到的数据,不会跨越而直接从内存读取,因此,就产生在多线程情况下要注意并发控制。

2.CAS
CAS(compare and swap),中文为:比较并交换,是并发控制操作的基础。
CAS有三个值:内存值、原始值、修改值,如果原始值不等于内存值,返回false;如果等于则修改,返回true,并将内存值修改为修改值。
CAS是乐观锁用到的主要机制,乐观锁是不用加锁去执行操作,如果产生冲突则失败重试,直到成功为止,也叫做“自旋”。
与乐观锁相对应的是悲观锁,synchronized就是悲观锁,也叫“独占锁”需要加锁进行操作,并且加锁代码块中的只能有一个线程进行操作。

接下来我们来看看java.util.concurrent下AtomicInteger源码

 // setup to use Unsafe.compareAndSwapInt for updates
 private static final Unsafe unsafe = Unsafe.getUnsafe();
 private static final long valueOffset;
 public final boolean compareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
 }
 /**
 * Atomically increments by one the current value.
 * @return the updated value
 */
 public final int incrementAndGet() {
    return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
 }

Unsafe类提供了硬件级别的原子操作,该类里面大部分都是native方法,从而使java间接访问到操作系统底层
CAS缺点:经典问题“ABA”问题,就是说,如果一个变量值为A,然后被修改成B,在修改成A,CAS会认为该变量没有被修改过,但是不会影响并发程序的正确性。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,968评论 0 11
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 43,015评论 11 349
  • 实现曾经幻想的事,不失为一种浪漫,自己对自己的浪漫。
    Healer17阅读 200评论 1 1
  • 孤独,算是一个永久的话题吧。这个词我们并不陌生,但孤独又与独处不同。孤独,是一种感觉到虚无的心理或是精神状...
    西米露lu阅读 1,196评论 2 6
  • 紫风踏雨阅读 200评论 0 0

友情链接更多精彩内容