Java后端
·2025-04-23复习第十五天
Java 中 volatile 关键字的作用是什么?
可见性,禁止指令重排序
可见性:读主内存
禁止指令重排序:内存屏障,读屏障,写屏障
Synchronized 和 ReentrantLock 有什么区别?
Synchronized 是一种基础的同步操作,没有非公平和超时等待的概率
Synchronized 实现锁主要依赖与监视器锁和对象头
需要先获取到对象头的监视器锁才能进行执行
修饰方法:
修饰代码快:
JDK1.6对Synchronized 的优化
偏向锁
轻量级锁
重量级锁
锁消除
锁粗化
ReentrantLock 是AQS的具体实现
包含state、同步队列、条件队列
state:
* state为1表示锁被占有
* state为0表示锁空闲
同步队列
* 非公平锁时,如果抢不到锁,通过CAS抢锁,如果还是抢不到,加入同步队列中
条件队列
* 使用Contidion.wait() 加入条件队列,使用Condition.singnal()从条件队列加入同步队列中
ReentrantLock 是一种比较复杂的锁,可以实现公平和超时
说说 AQS 吧?
抽象队列同步器,定义了一系列规范,很多同步器都对其进行了实现,比如说ReentrantLock、Semaphore、CyclicBarrier、CountDownLatch等
核心:volatile修饰的state变量和CLH队列
CLH队列的演变过程
* CAS自旋一个变量,产生总线风暴
* CLH通过一个隐式队列,每个线程自旋判断前一个线程是否释放了锁
* AQS实现的CLH队列 通过一个双向队列,除了队头的线程是持有锁的,其他的都处于阻塞状态,队头释放锁通知下一个线程执行。
Redis 中的 Big Key 问题是什么?如何解决?
占用内存比较大的key
问题:
* 内存倾斜
* 服务端查找慢
* 网络传输也慢
* 客户端超时
解决:
* 数据压缩
* 拆分
* 只存储必要信息
Redis 集群的实现原理是什么?
每个节点负责一部分的数据,2^14次方个槽位,通过hash计算出键所在的槽位
请求的时候随机请求一个节点,如果不存在,放回数据所在节点的信息给客户端,客户端重新请求
如何保证节点中数据的一致性?
使用Gossip协议
每个节点发生自身的信息给其他节点
其他节点收到信息之后和自身的信息汇总继续发送给其他节点,也就是更新哈希槽数组的信息,每一个槽指向那个节点实例
最终整个集群达到一致性
为什么槽的数目是2^14次方?
主要是为了防止心跳包太大了
如何解决 Redis 中的热点 key 问题?
访问频率占比很高的key
限流
读写分离
多级缓存
拆分
发现
hotkey命令
monitor命令
4
0
分享
操作
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
