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