CAS底层源码

CAS 全称为Compare And Swap 翻译为比较交换,作用是让CPU比较两个值是否相等,然后原子的更新某个位置的值,实现方式基于硬件平台的汇编指令,在intel的CPU中,使用的是cmpxchg指令,就是说CAS是靠硬件实现的,从而在硬件层面提升效率。

## CSA 原理

利用CPU的CAS指令,同时借助JNI来完成Java的非阻塞算法。
CAS操作是原子性的,所以多线程并发使用CAS更新数据时,可以不使用锁,JDK中大量使用CAS来更新数据而防止加锁来保持原子更新。
CAS操作包含三个操作数:**内存偏移量位置,预期原值,新值**。如果内存位置的值与预期值相同,那么处理器会自动将该位置值更新为新值,否则处理器不做处理。

## 源码分析

JUC包下面的类大部分都用了CAS实现原子性操作

### AtomicInteger 源码解析

```
// 使用 unsafe 类的原子操作方式
private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset;

static {
    try {
        //计算变量 value 在类对象中的偏移量
        valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value"));
    } catch (Exception ex) { throw new Error(ex); }
}
```

`valueOffset` 字段表示 ` "value"` 内存位置,在 `compareAndSwap` 方法 ,第二个参数会用到.

`偏移量`计算方式=

```
//方法相当于原子性的 ++i
public final int getAndIncrement() {
    //三个参数,1、当前的实例 2、value实例变量的偏移量 3、递增的值。
    return unsafe.getAndAddInt(this, valueOffset, 1);
}
//方法相当于原子性的 --i
public final int getAndDecrement() {
    //三个参数,1、当前的实例 2、value实例变量的偏移量 3、递减的值。
    return unsafe.getAndAddInt(this, valueOffset, -1);
}
```

`Unsafe` 调用C 语言可以通过偏移量对变量进行操作
[OpenJDK源码地址](https://download.java.net/openjdk/jdk8/promoted/b132/openjdk-8-src-b132-03_mar_2014.zip/)
目录:`openjdk\jdk\src\share\classes\sun\misc\Unsafe.java`

看代码可知 Unsafe使用了[单例模式](https://www.runoob.com/design-pattern/singleton-pattern.html)并提供getUnsafe()方法获取。

```

//获取Unsafe实例静态方法
@Cal

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CAS5.3是一个开源的软件,你可以通过以下步骤来编译它的源代码: 1. 下载源代码:首先,你需要从CAS5.3的官方仓库或者其他可靠的资源中获取源代码的压缩包。通常,这个压缩包会以.tar.gz或.zip的格式进行发布。 2. 解压源代码:将下载的压缩包解压缩到一个合适的目录中。 3. 安装依赖项:在编译之前,你需要确保你的系统具备所需的依赖项。这些依赖项可能包括Java JDK、Apache Maven等。请根据CAS5.3的文档或README文件中提供的说明来安装这些依赖项。 4. 配置CAS:进入解压后的源代码目录,并修改cas.properties文件以配置CAS的参数。根据你的需求,你可能需要更改数据库连接、登录页面等配置。 5. 编译源代码:使用Maven工具来编译源代码。在命令行终端中,进入源代码目录,并执行以下命令: ``` mvn clean package ``` 这个命令会自动下载所需的依赖项,并编译源代码。编译完成后,你将在target目录下找到生成的CAS构建文件。 6. 部署CAS:将生成的构建文件部署到你的应用服务器中,比如Tomcat。具体的部署步骤取决于你使用的应用服务器。请参考CAS5.3的文档或README文件中提供的说明。 请注意,以上步骤仅提供了一个大致的指导,实际情况可能因操作系统、依赖项版本等因素而有所不同。在进行编译之前,建议仔细阅读CAS5.3的文档并遵循其中的指引。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值