每日面试题:2024-03-26
每日面试题: 2024-03-26
谈谈 CAS
机制
CAS 是 compara and swap 的缩写,它是 JDK 底层
sum.misc.Unsafe
的方法,此方法是native
方法CAS 的 有三个核心参数
- 地址值
- 新值
- 期望的值
其操作流程就是当地址值对应的值是期望的值的时候,则将地址对应的值设置为新值。
这样的可能会衍生出这样的一个问题,就是存在线程1和线程2两个线程,同时处理 地址F对应的值。
线程1 期望地址的值是A,然后修改为B
线程2 期望地址是A,其会对A进行操作,最后又会修改为A
如果线程2先获得
CPU
的执行权的话,会对A进行操作,但是最后还是会设置为A线程2执行完之后,线程1 因为期望是A,所以它可以成功将地址值修改为B。
这就是
CAS
机制带来的ABA问题。但是我们可以通过版本号或者原子标记引用解决ABA问题
JDK
底层对应CAS
的野也有很多经典的使用场景。
- JDK 提供
Atomic
原子类底层就是使用CAS实现的java.util.concurrent.locks.AbstractQueueSynchronizer
java.util.consurrent.ConcurrentHashMap
java.util.consurrent.ConcurrentLinkeQueue
SpringBoot
如何解决跨域问题
什么是跨域问题
跨域问题是浏览器中的出现的一种安全策略,根据同源策略(Smae Origin Policy),出于安全考虑。浏览器限制了不同
源
的文档或者脚本对当前 源文档所能进行的操作。这里的源指的就是
- 协议(http/https)
- 域名
- 端口
三者的组合
解决跨域问题的方式
CROS
: 一种跨源的共享机制,Spring Boot就是采用当前方式解决的跨域问题JSONP
(JSON with Pading) 它允许通过<script>
获取数据,因为<script>
标签加载数据不受同源策略的影响。但是JSONP
只支持GET
请求,并且存在安全问题- 通过代理服务器配置来实现跨源资源的访问和操作
SpringBoot解决 跨域的问题
按照配置粒度,Spring Boot 支持全局和局部的跨域请求范围
- 基于
org.springframework.web.bind.annotaiton.CrossOrigin
注解
- 基于
org.springframework.web.servlet.config.annotation.WebMVcConfigurer
#addCrosMapping(CrossRegistry registry)
- 基于
org.springframework.web.filter.CorsFilter
实现跨越支持
Redis
和 MySQL
如何保证数据的一致性
出现一致性的原因
我们一般会对热点数据进行缓存,比如说商品列表。一般请求商品列表接口,接口会先从数据库查询数据,然后在响应的同时会把数据缓存到 Redis
数据库。这样下次再次进行同样的请求的时候,直接从 Redis
缓存中获取,从而减轻高并发环境的对数据库的压力。
因为我们的一份数据存在不同的地方一个数据库,一个缓存库,这样在极端情况下,可能会导致在商品被修改的情况,有用户会获取到缓存中的旧数据。这就出现了数据一致性的问题。
解决方式
一般情况下,我们都是采用最终一致性的方案,来解决缓存带来的数据带来的
- 使用可靠的消息传递,如
RocketMQ
通过异步消息来保证的Redis
和MySQL
的数据的最终一致性- 我们也可以通过使用诸如
Canal
监听MySQL的BinLog
日志来实现数据的最终一致性