对同一个服务的同一个接口同时发起两个请求会发生什么

两个请求是否会影响?(线程安全?)

当两个请求发送到服务器的同一个接口中,tomcat会使用线程池中的两个线程去并发(为了效率)的执行,进入Spring容器中,假设Bean是单例的,那么两个线程会并发(同时的)访问对应的变量(资源)。。。

如果是全局变量或者堆上【线程共享】,则会发生线程安全问题,使用同步机制,如悲观锁可以保证线程安全。

或者我们可以将当前变量放进local中(即进程内部的局部变量【存储在栈上】),这样线程都能拿到独立的数据。

这样在多个线程访问同一个变量的时候,访问的都是自己的变量,修改的也是自己的副本。

因此是线程安全的。。。。

如果两个请求操作的是同一个接口下的同一条数据呢?  是否是线程安全的?

肯定是线程安全的。我们要知道对于数据的操作最终是要落实在数据库如mysql中,多个操作就落实为了mysql中的多个事务。因为数据库本身有隔离级别(隔离不同的事务对数据修改的影响),这样我们两个线程对自己的变量进行修改,最终读取的话取决于MVCC(提供的读视图),来决定读的是哪个版本。

还有一种特殊情况:如果被访问的这个数据是需要被感知的,即秒杀优惠券的情况(因为库存小于等于0的时候不能继续下单了),就不能简单的交给多个事务去处理【即使是线程安全的,但是这个业务本身是线程不安全的】,最后还是通过分布式锁去串行(互斥)处理。

因此对于一个业务,我们需要先判断它是否是线程安全的? 如果是线程安全的,那这个业务本身是不是线程安全的?

  • 24
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值