- 博客(10)
- 收藏
- 关注
原创 黑马JUC——synchronized 原理进阶
Java SE 1.6为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”,在Java SE 1.6中,锁一共有4种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率,下文会详细分析。1.轻量级锁轻量级锁的使用场景:如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争),那么可以
2022-05-09 10:40:31 424 1
原创 黑马JUC——Java内存模型
1. Java内存模型JMM 即 Java Memory Model,它定义了主存(共享内存)、工作内存(线程私有)抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、 CPU 指令优化等。JMM 体现在以下几个方面:原子性 - 保证指令不会受到线程上下文切换的影响 可见性 - 保证指令不会受 cpu 缓存的影响 有序性 - 保证指令不会受 cpu 指令并行优化的影响2. 可见性退不出的循环先来看一个现象,main 线程对 run 变量的修改对于 t 线程不可见,导致了 t 线程无法
2022-05-08 17:40:11 276
原创 黑马JUC笔记——单例模式double-checked locking 问题
以著名的 double-checked locking 单例模式为例public final class Singleton { private Singleton() { } private static Singleton INSTANCE = null; public static Singleton getInstance() { if(INSTANCE == null) { // t2 /
2022-05-08 15:54:42 234
原创 gulimall——Redis缓存(六)
一、页面缓存页面缓存是应对高并发的一个比较常见的方案,当请求页面的时候,会先查询Redis缓存中是否存在,若存在则直接从缓存中返回页面,否则会通过代码逻辑去渲染页面,并将渲染后的页面缓存到Redis中,然后返回。因此在秒杀系统中,将秒杀商品详情页面存入Redis,将大大提高并发访问量。页面缓存逻辑如下:详细代码如下: @ApiOperation("商品详情") @RequestMapping(value = "/detail/{goodsId}", produces.
2022-05-07 17:42:32 413
原创 gulimall——Nginx搭建域名访问环境及动静分离实现(五)
一、正向代理与反向代理1.1正向代理正向代理就是一个位于客户端和目标服务器之间的代理服务器,为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标(目标服务器),然后代理服务器向目标服务器发送请求并将获得的内容返回给客户端。此时的代理服务器是由用户自主设置的,客户端请求都被代理服务器的请求给替代,因此正向代理能够隐藏客户端的信息。1.2 反向代理反向代理方式是指代理服务器接受连接请求,然后将请求发送给内网服务器,并将从内网服务器收到的结果返回给客
2022-05-06 17:53:40 771
原创 gulimall——网关配置及跨域问题的解决(四)
一、前后端分离导致的请求路径问题后端有各种微服务,不同的例如Product(10002),Order(9001),Ware(11001)。因此通过WebSocket访问存在两个问题:不同服务有不同的端口,难以管理,很容易出错 分布式情况下,同一个服务会有多个实例,每个实例的端口也不一样,例如Product就可以有10001,10002,10003等等因此将前端请求的基准地址改为88端口,发送给网关同一处理。// api接口请求地址window.SITE_CONFIG['baseUrl
2022-05-05 20:35:02 1067
原创 gulimall——秒杀安全优化(三)
1.优化思路(1)秒杀接口地址隐藏。防止有人恶意秒杀(2)数学公式验证码。也能防止恶意秒杀。并且能够减轻秒杀系统的瞬时流量,减轻并发量。(3)接口限流防刷。限制一个用户1分钟之内只能访问某个接口10次。2.秒杀接口地址隐藏每次点击秒杀按钮,才会生成秒杀地址,秒杀地址不是写死的,是从服务端获取,动态拼接而成的地址。(HTTP协议是明文传输,前端是防不住恶意用户的攻击,所以安全校验要放在服务端,从而禁止掉这些恶意攻击。)实现思路:在进行秒杀之前,去后端获取一个动态的秒杀地址path(服务
2022-05-04 17:04:29 280
原创 gulimall——秒杀商品流程及优化(二)
1、秒杀商品1.0(1)先从数据库查询秒杀商品数量,如果秒杀商品大于0,就执行下面的步骤。(2)根据memberId和orderId查询用户是否存在此商品的秒杀订单,如果存在就不能再次秒杀,可以防止重复秒杀。(3)减库存,下订单,写入秒杀订单(直接操作数据库)。这三步需要在同一个事务中执行,只要有一个步骤执行失败,就会导致回滚该版本存在一个问题,就是减库存的时候会出现超卖的现象?采用5000个线程进行压力测试就会出现超卖的现象。如何解决?首先采用了悲观锁的思路,对记录进行加锁for upd
2022-05-04 16:52:37 1131
原创 gulimall——秒杀商品上架流程(一)
1、秒杀商品上架流程图2、设置定时任务通过定时任务,每天三点上架最近三天的秒杀商品。同时为了避免分布式情况下同时上架的情况,使用了分布式锁。 定时任务默认是阻塞的,上一个未执行完下一个会一直阻塞住,因此@Async开启异步任务。//秒杀商品上架功能的锁 private final String upload_lock = "seckill:upload:lock"; /** * 定时任务 * 每天三点上架最近三天的秒杀商品,提前预告 *.
2022-05-04 15:27:49 358
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人