每天一套面试题Day24-八股高频(5)
31.说说volatile的用法及原理。
- volatile的可见性原理,从Java语言层面看,是通过在编译期插入内存屏障指令来实现的。这个屏障会强制将写缓冲区的数据刷新到主内存,并使其他CPU的缓存行失效。而底层硬件,会依靠缓存一致性协议(比如MESI) 来具体执行这个失效和重新加载的过程,从而保证了多线程下的可见性。
- 禁止指令重排序 volatile 通过插入内存屏障来禁止 JVM 和处理器进行指令重排序优化,从而保证代码执行顺序与程序顺序一致。编译期屏障:阻止编译器重排序 运行期屏障:在字节码中插入具体的内存屏障指令
32.说说线程的创建方式。
- 继承Thread类并重写run方法。
- 实现Runnable接口并实现run方法。
- 使用Callable接口配合FutureTask实现带返回值的线程。
- 通过线程池(如Executor框架)创建管理线程。
33.建索引时需注意哪些事项?
34.TCP 协议如何保证可靠传输?
我的博客 滑动窗口(序号+累积 ACK+超时重传) 保证 数据不漏、不乱。 校验和保证 数据不损坏。 滑动窗口与流量控制 保证 不超过接收方的能力。 拥塞控制 保证 网络不被压垮
35.Redis中的Zset怎么实现的?
压缩列表(ziplist)-连续内存卡组成的顺序型(节约内存)
ziplist: 在 ziplist 中,成员(member) 和 分值(score) 是成对依次存放的。并且,所有元素会按照分值从小到大进行排序。 小林跳表
skiplist :一个 skiplist 编码的 Zset,在 Redis 底层实际上是由 一个字典(Dict) 和 一个跳跃表(Skip List) 共同构成的数据结构。 字典(Dict)能够在 O(1) 时间复杂度内直接通过成员名找到其分值。 跳跃表(Skip List) 作用:提供以分值为基础的排序功能,支持 O(logN) 复杂度的插入、删除、查找以及范围查询。
Listpack 压缩列表存在问题连锁更新->Listpack(列表包)(在删除或更新元素时可能会引发连锁更新(cascade update)。因为每个entry中存储了前一个entry的长度(prevlen),而prevlen本身是变长的(1字节或5字节)。当某个entry被更新或删除时,如果导致下一个entry的prevlen字段长度发生变化,那么就可能需要连续地更新多个entry。在最坏情况下,需要重新分配整个ziplist。) 取消前向指针,解决连锁更新。 每个 entry 的结构:编码类型+数据 + 整个 entry
36.分布式锁的原理和常见的实现有哪些?
#面试真题#每日一套面试真题 文章被收录于专栏
记录刷过的面试真题