java并发
HXACA_XMUT
我差不多已经是条咸鱼了_(:зゝ∠)_
展开
-
简单的并发模型介绍
Future 联合异步请求和代理模式 客户端发生请求后,服务端立即返回一个假的代理数据,用户无需等待,执行其他操作后,再去调用服务器组装的真实数据。 当用户请求真实数据时, 会先判断是否组装好,如果没有组装好会wait,组装完毕后通知该线程,返回结果。 Fork/Join模型 将任务分割成若干小任务,然后通过不同线程来做这些小任务,最后组装成大任务。 Actor模型 Actor模型 = 数据 + 行为 + 消息 每个Actor封装自己的状态,并且和其他Actor物理隔离。Actor内部时单线.原创 2020-05-22 11:13:45 · 183 阅读 · 0 评论 -
MySQL中是如何解决幻读问题的
读写并发 MVCC多版本控制 可以看做是乐观锁的一种实现,维护版本号 保证了同一个事务中,数据一致性 每行数据都存在一个版本,每次修改更新时会更新版本 修改时,会拷贝出当前版本号,然后随意更改,事务之间不干扰 保存时,如果成功会覆盖记录,失败则回滚 查询时,需要满足两个条件 删除版本号未指定或者大于当前事务版本号,也就是保证读取的行并未被删除 创建版本号小于或等于当前版本号,也就是在之前的事务进行的插入 写写并发 间隙锁 行锁锁住了行,但是无法解决插入删除操作,因为他们实际是对于行之.原创 2020-05-20 13:42:41 · 277 阅读 · 0 评论 -
实现一个简单的漏斗限流
限流:系统能力有限或出现有恶意请求时,需要组织部分请求,防止系统压力过大造成宕机。也就是在规定时间内一个操作只能执行有限次数,超出就是非法行为。 简单限流:通过维护某个时间区间,判断改时间区间内发生的次数。 漏斗限流:在每次试图处理请求前,先计算和上一次请求的间隔,并恢复该部分的空间。只有在空间允许的情况下才会放行该请求。 redis不能直接使用以下代码思路,因为无法保证操作的原子性,如果为...原创 2020-04-22 19:26:02 · 355 阅读 · 0 评论 -
Redis实现一个简单的延时队列
延时队列 通过redis中的zset我们可以实现一个简单的延时队列。通过将score设置为时间,然后多线程轮训的去查询是否有到期的可以执行的任务。 考虑到多线程并发,使用zrem去保证每一个任务只会被执行1次,这里也可以使用lua脚本来优化,减少空取的情况。 代码实现 package com.xliu.chapter1; import com.alibaba.fastjson.JSON...原创 2020-04-22 09:16:18 · 281 阅读 · 0 评论 -
Redis实现可重入分布式锁
分布式锁 通过在redis设置一个特定值,只有成功设置这个值得线程,才被看做拿到了锁,并能去使用一些资源,使用结束后删除该值,使得其他线程能去拿到高锁。由于业务逻辑中可能出现异常,导致删除操作没有被执行,引发死锁,所以一般会给锁设置一个较短的有效值。 超时问题 由于业务逻辑有可能比较复杂,导致锁已经失效,但业务逻辑还没执行结束。所以一般不建议在较长时间的业务中使用redis分布式锁。 出...原创 2020-04-21 14:44:08 · 993 阅读 · 0 评论 -
volatile的一点小知识
volatile是轻量级的synchronized。保证可见性,避免指令重排,但不保证原子性。 内存屏障:一组处理器指令,实现对内存操作的顺序限制。 有volatile修饰的变量,在进行写操作时,会发生两件事: Lock前缀指令会引起处理器缓存回写内存,也就是写一个volatile变量时,JMM会把线程对应的本地内存中的共享变量值刷新到主内存。 一个处理器缓存回写内存会导致其他处理器的缓存失效...原创 2020-04-17 18:54:39 · 118 阅读 · 0 评论