区别 实现原理 Redis 分布式锁:主要基于 Redis 的原子操作。常见的是使用 SETNX(SET if Not eXists)命令或者 SET 命令的扩展参数(如 NX、EX)来实现。当一个客户端成功设置锁对应的键值时,就表示获取到了锁;释放锁则是删除对应的键。为了防止死锁,通常会给锁设置一个过期时间。 Zoo […]
区别 实现原理 Redis 分布式锁:主要基于 Redis 的原子操作。常见的是使用 SETNX(SET if Not eXists)命令或者 SET 命令的扩展参数(如 NX、EX)来实现。当一个客户端成功设置锁对应的键值时,就表示获取到了锁;释放锁则是删除对应的键。为了防止死锁,通常会给锁设置一个过期时间。 Zoo […]
背景 据Redisson官网的介绍,Redisson是一个Java Redis客户端,与Spring 提供给我们的 RedisTemplate 工具没有本质的区别,可以把它看做是一个功能更强大的客户端(虽然官网上声称Redisson不只是一个Java Redis客户端) 我想我们用到 Redisson 最多的场景一定是 […]
什么是线程安全? 线程安全是指保证多线程环境下共享的、可修改的状态的正确性。 线程安全需要保证几个基本特性 原子性:相关操作不会中途被其他线程干扰,一般通过同步机制实现。 可见性:一个线程修改了某个共享变量,其状态能够立即被其他线程知晓,通常被解释为将线程本地状态反映到主内存上,volatile就是负责保证可见性的。 […]
volatile作用 volatile主要是为了解决多线程内存不可见问题。 对于一写多读,是可以解决变量同步问题,但是如果多写,同样无法解决线程安全问题。 其次是为了保证代码的有序性。 虚拟机在编译的时候,是有可能把代码的顺序进行重排序的,不一定会按照我们写的代码的顺序来执行,对于有些代码进行重排序之后,虽然对变量的值 […]
ConcurrentHashMap数据结构 ConcurrentHashMap的数据结构(数组+链表+红黑树),桶中的结构可能是链表,也可能是红黑树,红黑树是为了提高查找效率。具体是链表还是红黑树,要看binCount是否大于等于转化为红黑树的阈值。 ConcurrentHashMap继承关系 public class […]
背景 数据库中有一张叫后宫佳丽的表,每天都有几百万新的小姐姐插到表中,光阴荏苒,夜以继日,日久生情,时间长了,表中就有了几十亿的小姐姐数据,看到几十亿的小姐姐,每到晚上,我可愁死了,这么多小姐姐,我翻张牌呢? 办法当然是精兵简政,删除那些age>18的,给年轻的小姐姐们留位置... 于是我在数据库中添加了一个定时 […]
黄沙百战穿金甲,不破楼兰终不还。