CAS机制
发表于|更新于|知识点详解
|总字数:204|阅读时长:1分钟|浏览量:
CAS机制
知识点助记
可以把CAS比作去停车场停车
- 车位状态牌 = 内存中的值(V)
- 你看到的空位 = 预期值(A)
- 你的车 = 新值(B)
- 管理员 = CPU的原子指令
只有当你亲眼看到车位是空的(A=V)才能把自己的车停进去(V=B)。这期间被别人抢先就要重新观察
解析
CAS(Compare-And-Swap)是CPU提供的原子指令。顾名思义:比较并交换。
CAS属于乐观锁的一种实现方式,主要就是为了解决synchronized等锁机制会导致线程阻塞/唤醒的性能消耗
它在并发下是没有锁的,线程不阻塞,可以通过重试来解决冲突
使用
文章作者: Jaymr
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 花海!
相关推荐
2025-09-30
Java集合相关知识点
一、Java集合 List相关面试题 数组是一种用连续的内存空间存储相同数据类型数据的线性数据结构 例:int 是4字节,所以一个数字占4个空 寻址公式:a[i] = baseAddress + i * dataTypeSize 直接根据漂移量就能找到数组中的元素,所以数组访问速度很快 ArrayList源码分析 初始化ArrayList ArrayList<Integer> list = new ArrayList<>(); 创建空数组Object[] elementData = {}初始容量为10就算是 ArrayList list = new ArrayList(10); 那也只是创建了一个大小为10的数组,容量为10,并没有扩容 添加元素 list.add(1); 调用源码: public boolean add(E e) { modCount++; // 修改计数器 add(e, elementData, size); // 调用私有添加方法 return true;}private void add(...
2025-10-06
MQ消息可靠性
MQ消息可靠性是什么首先我们要知道。MQ是消息中间件,MQ的消息的发送是异步的。其主要步骤是: 生产者 -> 交换机 -> 队列 -> 消费者 其中有3个传输数据的地方,任意一个步骤出错都有可能导致数据丢失。那么我们怎么保证消息的可靠性呢? 为什么其实消息可靠性是根据业务场景来进行要求的 金融支付:丢消息就是丢钱 订单系统:丢消息就是损失收入 日志采集:可允许少量丢失,保证速度快 实时监控:允许部分丢失,保证延迟低 怎么做第一步:生产者确认机制(Publisher Confirms)首先我们保证消息成功到达Broker(RabbitMQ服务器) // 1. 开启生产者确认channel.confirmSelect();// 2. 发送消息channel.basicPublish("exchange", "routingKey", new AMQP.BasicProperties.Builder() .deliveryMode(2) // 持久化消息 ...
2025-10-01
MQ相关知识点
一、RabbitMQ1.1 什么场景下会使用MQ 异步发送 MySQL和Redis之间的数据同步 分布式事务 消峰填谷 解耦 异步 消峰 1.2 MQ如何保证消息不丢失消息发送过程 ~各个环节都有可能造成消息丢失~ RabbitMQ提供了publisher confirm机制,即发送方确认机制,保证消息不丢失。消息发送到MQ之后,会返回一个确认结果给发送方。如果发送方没有收到确认结果,则认为消息丢失。 正常发送到队列之后会返回一个ack publish confirm 如果失败: 发送到交换机失败:nack publish confirm 发送到队列失败:ack publish return 处理方法 使用生产者确认机制 回调方法即时重发 记录日志 保存到数据库然后定时重发 发送成功就删除表中的数据 消息持久化 交换机持久化 队列持久化 消息持久化 消费者确认机制 manual 手动ack auto 自动ack none 关闭ack 开启消费者失败重试机制 超过重试次数交给error交换机 交给人工处理 1.3 Rabbit重复消费问题怎么解决...
2025-10-02
MySQL相关知识点
一、MySQL优化目录 1.1 慢查询 1.2 索引 1.3 SQL优化的经验 1.4 事务相关 ACID 1.5 并发事务带来的问题 1.6 undo log 和 redo log的区别 1.7 MVCC 1.8 主从同步原理 1.9 分库分表 1.1 慢查询1.1.1 如何定位慢查询?慢查询表象:页面加载过慢 解决方案一 开源工具调试工具:Arthas运维工具:Prometheus、Skywalking 解决方案二 MySQL自带慢日志慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息: 答: 介绍当时问题场景(压力测试时 某个接口响应时间很慢) 在mysql中开启了慢日志查询,设置2秒,一旦sql执行超过2秒就会被记录在日志中(调试阶段) 1.1.2 sql语句执行很慢 如何分析呢? 聚合查询(新增临时表) 多表查询(优化sql语句结构) 表数据量过大查询(添加索引) 深度分页查询 解决方案一 ...
2025-10-08
RedisTemplate的使用
RedisTemplate的使用RedisTemplate是Spring Data Redis提供的核心抽象类,是Spring Boot访问Redis服务器的底层实现。 有了RedisTemplate就不用Jedis的连接池或者直连,手动序列化对象,查询时还需要手动反序列化,还要处理各种异常和链接关闭 RedisTemplate就可以直接访问Redis服务,并且自动处理各种异常和链接关闭 redisTemplate.opsForValue().set("user:1", user);User result = (User) redisTemplate.opsForValue().get("user:1"); 核心配置RedisTemplate使用之前需要配置RedisConnectionFactory @Configurationpublic class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate( ...
2025-10-08
Redis用ZSet实现实时积分排行榜
Redis用ZSet实现实时积分排行榜背景需求:实时积分排行榜要求实时性,有序性 为什么要用Redis的ZSetRedis的ZSet就像一个巨型的的电子记分牌,上面会有所有用户的积分和排名情况ZSet是由Redis提供的一种数据结构。他存储一组唯一的成员,每个成员关联一个分数。成员按分数自动排序。 极致的实时性 天然排序 简单易用 高性能、高并发 而使用数据库(如MySQL),一是实时性低,二是复杂度高,需要写sql,最后就是高并发能力差。 核心操作 ZADD key score member : 添加或更新成员及其分数 ZINCRBY key increment member : 给指定成员分数增加(可正可负)分数。(最常用) ZREVRANGE key start stop : 获取分数从高到底(REV是reverse)排名在[start,stop]区间内的成员 ZREVRANK key member : 获取指定成员在从高到低排名中的名次(0表示第一名) ZSCORE key member : 获取指定成员的分数 ZCARD key : 获取ZSet的成员数量 具体实...
公告
主包的WX:Jaymr1031 欢迎交流
