avatar

nk

学习 思考 坚持 平静

  • 首页
  • 关于
Home 每日面试题:2024-03-26
文章

每日面试题:2024-03-26

Posted 2024-03-27 Updated 2024-03- 27
By nk
10~13 min read

每日面试题: 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)
  • 域名
  • 端口

三者的组合

解决跨域问题的方式

  1. CROS: 一种跨源的共享机制,Spring Boot就是采用当前方式解决的跨域问题
  2. JSONP (JSON with Pading) 它允许通过 <script>获取数据,因为 <script>标签加载数据不受同源策略的影响。但是 JSONP只支持 GET请求,并且存在安全问题
  3. 通过代理服务器配置来实现跨源资源的访问和操作

SpringBoot解决 跨域的问题

按照配置粒度,Spring Boot 支持全局和局部的跨域请求范围

  • 基于 org.springframework.web.bind.annotaiton.CrossOrigin注解

image-cvvvs.png

  • 基于 org.springframework.web.servlet.config.annotation.WebMVcConfigurer#addCrosMapping(CrossRegistry registry)

image-yndce.png

  • 基于 org.springframework.web.filter.CorsFilter实现跨越支持

Redis和 MySQL如何保证数据的一致性

出现一致性的原因

我们一般会对热点数据进行缓存,比如说商品列表。一般请求商品列表接口,接口会先从数据库查询数据,然后在响应的同时会把数据缓存到 Redis数据库。这样下次再次进行同样的请求的时候,直接从 Redis缓存中获取,从而减轻高并发环境的对数据库的压力。

因为我们的一份数据存在不同的地方一个数据库,一个缓存库,这样在极端情况下,可能会导致在商品被修改的情况,有用户会获取到缓存中的旧数据。这就出现了数据一致性的问题。

解决方式

一般情况下,我们都是采用最终一致性的方案,来解决缓存带来的数据带来的

  • 使用可靠的消息传递,如 RocketMQ通过异步消息来保证的 Redis和 MySQL的数据的最终一致性
  • 我们也可以通过使用诸如 Canal监听MySQL的 BinLog日志来实现数据的最终一致性
面试题的智慧
面试智慧
License:  CC BY 4.0
Share

Further Reading

Mar 27, 2024

每日面试题:2024-03-26

每日面试题: 2024-03-26 谈谈 CAS机制 CAS 是 compara and swap 的缩写,它是 JDK 底层 sum.misc.Unsafe的方法,此方法是 native方法 CAS 的 有三个核心参数 地址值 新值 期望的值 其操作流程就是当地址值对应的值是期望的值的时候,则将地

Mar 26, 2024

每日面试题: 2024-03-25

每日面试题:2024-03-25 ArrayList 和 LinkedList的区别 ArrayList 内部是使用数组中实现,其内存空间是连续的,其占用的内存相对较小,可能会产生内存碎片。其支持快速的随机访问。其时间复杂度是O(1) LinkedList 使用双向链表实现的,其内存空间不是连续的,

Mar 22, 2024

每日面试题: 2024-3-21

每日面试题: 2024-3-21 说说 你对 Cookie,Session,Token的理解 ChatGPT的回复 什么 JWT

OLDER

每日面试题: 2024-03-25

NEWER

拥抱云原生:起始

Recently Updated

  • 拥抱云原生:Dockerfile 的多阶段构建
  • 拥抱云原生:Dockerfile
  • 拥抱云原生:Docker文件系统
  • 拥抱云原生:Docker 指令小析
  • 拥抱云原生:起始

Trending Tags

Nginx 工作报告 云计算 云原生 Alpine Linux Docker Spring Linux 面试智慧

Contents

©2025 nk. Some rights reserved.

Using the Halo theme Chirpy