狂feng
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命令
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP