前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每日一博 - CAS(Compare-And-Swap)原理剖

每日一博 - CAS(Compare-And-Swap)原理剖

作者头像
小小工匠
发布2021-11-10 11:05:59
4380
发布2021-11-10 11:05:59
举报
文章被收录于专栏:小工匠聊架构

文章目录

在这里插入图片描述
在这里插入图片描述

What’s CAS & sun.misc.Unsafe

全称 Compare-And-Swap , 主要实现的功能是和内存中的某个位置的值进行比较判断是否为预期值,如果是预期值则更改为新值, 整个过程具有原子性。

在这里插入图片描述
在这里插入图片描述

CAS & sun.misc.Unsafe

CAS属于CPU并发原语

CAS是一种系统原语,原语属于操作系统应用范畴,是由若干条指令组成,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条CPU的原子指令,不会造成所谓的数据不一致的问题,即CAS是线程安全的

在JDK中,主要体现在sun.misc.Unsafe类。

在这里插入图片描述
在这里插入图片描述

当执行UnSafe类中的cas相关方法时, JVM会转换成类似汇编指令,通过它实现了原子操作。

来看个代码

代码语言:javascript
复制
package com.artisan.juc;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author 小工匠
 * @version 1.0
 * @description: TODO
 * @date 2021/11/6 13:11
 * @mark: show me the code , change the world
 */
public class CASTest {

    public static void main(String[] args) {

        // 设置初始值为100
        AtomicInteger atomicInteger = new AtomicInteger(100);

        // 使用atomicInteger的compareAndSet,如果为100,则更新为123
        boolean b = atomicInteger.compareAndSet(100, 123);
        System.out.println(b + "----" + atomicInteger.get());

        // 使用atomicInteger的compareAndSet,如果为100,则更新为456 (上一步已经更新成了123,所以不是100)
        b = atomicInteger.compareAndSet(100, 456);
        System.out.println(b + "----" + atomicInteger.get());


    }
}

输出

代码语言:javascript
复制
true----123
false----123
在这里插入图片描述
在这里插入图片描述

底层原理剖析

在这里插入图片描述
在这里插入图片描述

输出

在这里插入图片描述
在这里插入图片描述

我们来研究下 getAndIncrement

在这里插入图片描述
在这里插入图片描述

调用了unsafe# getAndAddInt

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/11/06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • What’s CAS & sun.misc.Unsafe
  • CAS & sun.misc.Unsafe
  • 底层原理剖析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档