REJAVA / LEARNING NOTES
双语术语表
随时回查术语、规则和示例;完整解释见对应课程。
根据课程材料整理
本次更新说明
- 恢复第7课阻塞队列术语(第130–143条)与 put、add 的完整释义;新增第144–289条,覆盖第8–19课。
- 来源区补充 CompletableFuture 官方摘录链接。
- 整理为公开学习笔记,保留技术内容与练习。
- 清理个人分析,完善阅读导航。
遇到不熟悉的术语时,先看定义,再回到对应课程中的例子。
课程目录 · 复习方法(本地资料)
JMM(Java 内存模型)
规定共享内存并发访问的合法行为,不是堆栈分区。
JVM(Java 虚拟机)
执行 Java 字节码的运行环境;其内存区域与内存模型是不同问题。
CPU(处理器)
执行指令的硬件资源,不代表下游服务的处理容量。
happens-before(先行发生关系)
建立操作间的可见性与顺序约束,不等于墙上时钟的先后。
volatile(可见性关键字)
提供相关写读可见性与重排序约束,不让复合自增自动具备原子性。
synchronized(内置同步关键字)
获取对象监视器,互斥要求相关访问遵守同一锁协议。
monitor(监视器)
与对象关联的同步机制,同一时刻最多一个执行线程持有,可重入。
reentrancy(可重入)
持有当前监视器的线程可以再次获取它。
atomicity(原子性)
某个操作按约定表现为不可分割整体;不等同异常自动回滚。
visibility(可见性)
在同步关系成立时,先前写入对后续读取可见。
ordering(有序性)
执行结果遵守内存模型规定的顺序约束,不禁止所有重排序优化。
CAS(比较并交换)
位置仍为预期值时才更新;失败后如何重试由算法决定。
DCL(双重检查锁定)
锁外先检查、锁内再次检查的初始化方式;引用仍需正确安全发布。
ACC_SYNCHRONIZED(同步方法访问标志)
用于同步方法;实例和静态方法都适用。
monitorenter(进入监视器指令)
同步代码块获取监视器。
monitorexit(退出监视器指令)
同步代码块释放监视器;编译示例含正常与异常路径。
ThreadPoolExecutor(线程池执行器)
按核心数、队列、最大数与运行状态接纳工作。
thread pool(线程池)
复用执行线程并管理工作接纳与生命周期。
worker thread(工作线程)
执行工作的资源,排队工作不各占一条线程。
task(任务)
被提交的工作内容。
corePoolSize(核心线程数)
低于此数时优先尝试创建;包含忙碌和空闲数量。
maximumPoolSize(最大线程数)
通常入队失败后扩容时的上限,不意味着立刻创建到该数。
keepAliveTime(空闲回收时间)
约束空闲等待,不是正在执行的工作超时。
unit(时间单位)
与时间数值一起构成配置。
workQueue(任务队列)
保存等待处理的工作;构造参数是队列对象。
threadFactory(线程工厂)
负责创建执行线程,创建时机由执行器决定。
handler(拒绝处理器)
工作无法接纳时执行处理策略。
AbortPolicy(抛异常拒绝策略)
抛出拒绝异常。
CallerRunsPolicy(调用者执行策略)
未关闭时由提交者执行;已关闭时丢弃。
DiscardPolicy(丢弃当前任务策略)
静默丢弃新提交的工作。
DiscardOldestPolicy(丢弃队头任务策略)
未关闭时移除队头再重试;关闭后丢弃。
Runnable(无返回值的任务接口)
执行方法不直接返回计算结果;通过提交仍能获得完成句柄。
Callable(有返回值的任务接口)
执行时可以返回结果或抛出异常。
Future(异步结果句柄)
代表执行结果的获取与取消接口,不保证业务成功。
submit(提交并返回结果句柄的方法)
接受两类工作并返回结果句柄。
execute(执行提交方法)
提交工作,不返回结果句柄。
getCause(获取原始原因方法)
查看包装异常背后的失败原因。
TimeoutException(等待超时异常)
此次等待未及时取得结果,不表示工作已停止。
ExecutionException(任务执行异常)
结果获取报告执行失败,可检查原始原因。
RejectedExecutionException(任务被拒绝异常)
提交接纳阶段拒绝。
InterruptedException(中断异常)
可中断等待的退出信号之一,须按协议处理。
shutdown(有序关闭)
不再接纳新工作,既有工作继续;方法本身不等待全部终止。
shutdownNow(尝试立即关闭)
尝试中断正在执行的工作并停止处理等待队列,不保证立刻全部结束。
awaitTermination(限时等待终止的方法)
等待关闭后终止;等待超时不自动停止工作。
isInterrupted(检查中断状态的方法)
检查当前状态,不清除中断标记。
CountDownLatch(倒计时协调器)
示例中安排观察顺序的辅助工具,不是本课必须背诵的实现。
Map(映射)
保存键与值的对应关系。
HashMap(普通哈希映射)
本身不提供同步保证。
ConcurrentHashMap(并发哈希映射)
提供并发操作与单键条件更新;不自动保护组合业务和可变值内部状态。
ConcurrentMap(并发映射接口)
定义并发映射的操作约定,具体计算保证需查实现文档。
putIfAbsent(不存在才放入的方法)
仅缺失时放候选值,返回旧值。
computeIfAbsent(缺失时计算的方法)
缺失才计算,返回当前或新建值;不是永久只计算一次。
compute(原子重算方法)
在并发哈希映射中根据当前映射原子决定新值。
merge(原子合并方法)
缺失放初值,已有则原子合并。
ArrayList(可变数组列表)
普通实现不自动支持并发修改;放进并发映射不会改变这一点。
ReentrantLock(可重入锁)
显式锁,常以最终清理块确保解锁。
AtomicInteger(原子整数类)
提供指定的原子整数操作。
LinkedBlockingQueue(链式阻塞队列)
未指定容量时上限非常大,不能把它当成业务容量保护。
ArrayBlockingQueue(数组阻塞队列)
使用固定容量存储等待元素。
SynchronousQueue(同步移交队列)
没有内部存储容量,用于配对移交。
Integer(整数包装类型)
不可变整数值;多个读写步骤仍可能丢失更新。
Class(类对象类型)
静态同步方法锁定声明类对应的类对象。
this(当前实例)
实例同步方法锁定接收调用的实例。
finally(最终清理代码块)
正常语言退出路径上的清理位置,不等于一定停止业务。
return(退出方法语句)
退出当前方法;仍需执行相应最终清理。
break(跳出循环语句)
退出循环后继续执行其后的代码。
retrieval practice(检索练习)
从记忆提取并解释,区别于刚看完答案的复述。
spacing(间隔练习)
隔开时间再回忆,具体间隔按表现调整。
interleaving(交错练习)
适量混合已经学过的相关技能,不提前考未教内容。
fluency strength(当场提取流畅度)
当时说得顺不能单独证明长期保持。
storage strength(长期保持强度)
通过延迟与变式观察,而非一次熟悉感判定。
AI(人工智能)
课程只在概念层面覆盖它,不依据趋势文章推定它是普遍要求。
CRUD(增删改查)
表示创建、读取、更新和删除这四类基础数据操作。
GC(垃圾回收)
管理不再使用对象的内存回收。
Lock(显式锁接口)
相关访问须遵守同一同步协议,通常在最终清理中释放。
List(列表接口)
接口类型本身不保证任意实现支持并发修改。
ThreadFactory(线程工厂接口)
按执行器需要创建线程。
Executors(执行器工厂工具类)
提供预配置执行器,仍须理解其容量和生命周期。
TimeUnit(时间单位枚举)
与时间值一起描述超时或空闲期限。
Thread(线程类)
代表执行线程;线程身份与锁对象身份不同。
get(读取方法)
具体保证取决于所属类型,读取映射与等待异步结果不能混用。
put(写入方法)
放入一个元素的方法。在映射里建立或替换键值,单次安全不使复合操作自动安全;在阻塞队列里,队满时调用它的线程会一直等到有空位。
size(数量方法)
并发更新期间的临时状态不能单独作严格容量控制。
null(空值)
语义取决于调用契约,并发哈希映射不接受空键或空值。
LongAdder(分散累加器)
把计数分散到多个单元、读取时再求和的累加器;ConcurrentHashMap(并发哈希映射)的元素计数采用它的特化形式,并发时读到的总数是估计值。
String(字符串类型)
本课用作键或演示返回值。
Object(对象类)
对象可关联监视器,锁身份按对象确定。
Future.get(获取结果方法)
取得结果,必要时等待;带期限的重载超时不自动取消执行。
Thread.sleep(线程休眠方法)
等待指定时间,收到中断时可抛出中断异常并清除标记。
Integer.MAX_VALUE(整数类型最大值)
数值为2147483647;用作默认队列容量不等于现实资源无限。
ThreadPoolExecutor.afterExecute(执行后回调方法)
执行器提供的回调;被结果包装捕获的异常不一定直接传入此方法。
AbstractExecutorService.submit(提交并返回结果句柄的方法)
包装工作并交给执行入口,再返回句柄。
memory barrier(内存屏障)
描述内存操作顺序约束的实现层概念;具体指令由虚拟机和处理器决定,不能替代语言层同步规则。
StoreStore(写写屏障)
描述写操作之间的顺序约束,是屏障模型中的类别,不表示所有处理器都逐条插入同名指令。
StoreLoad(写读屏障)
描述写操作与后续读操作之间的顺序约束;实际实现依赖目标处理器。
LoadLoad(读读屏障)
描述读操作之间的顺序约束;不把模型类别等同于固定机器指令。
LoadStore(读写屏障)
描述读操作与后续写操作之间的顺序约束;具体实现按平台核对。
ExecutorService(执行器服务接口)
扩展任务执行接口,提供提交结果句柄和管理关闭生命周期的方法;关闭请求不等于全部工作已经终止。
key(键)
用来查找对应数据的标识;第6课用部门编号举例。
value(值)
根据键找到的数据;第6课先用审批数量,再用记录列表举例。
mapping(映射关系)
一个键与其对应值之间的联系,例如部门A对应数量5。
thread(线程)
程序中的一条执行流程;多个流程可以交错访问同一份数据。
lost update(更新丢失)
多次修改没有全部体现在最终数据中;例子是两方都读0,再各自写回1。
composite operation(组合操作)
由多个步骤拼成的一件事;每步安全不表示整个过程自动安全。
thread safety(线程安全)
多方并发访问时,仍满足所用类型承诺的操作规则;需说明保护到哪一步。
lambda expression(匿名函数表达式)
Java 中提供一段计算或动作的写法;箭头前是参数,后面是这段计算或动作。
function(函数)
接收数据并执行一段计算;本课的更新函数把计算结果返回给方法。
single-key update(单键更新)
只针对一个编号对应的数据进行更新,不自动包含另一个编号的修改。
transaction(事务)
把一组业务操作作为统一处理单元;具体成功、失败和并发可见规则需另行保证。
iteration(遍历)
把集合中的元素逐项取出或访问。
snapshot(快照)
某一时刻的整体状态;分时读取的数据不自动组成同一时刻的状态。
weakly consistent iteration(弱一致性遍历)
并发更新时可继续遍历,结果可能包含开始时或之后的部分状态,不保证整份结果来自同一瞬间。
ConcurrentModificationException(并发修改异常)
某些遍历方式检测到不允许的修改时报告的异常;未抛此异常不表示数据操作一定安全。
Collections.synchronizedMap(同步映射包装方法)
返回带同步保护的映射包装;访问须经过包装,遍历时还须按返回对象同步。
add(追加方法)
追加元素的方法。在列表里,追加不会因列表放在并发映射中就自动得到同步保护;在阻塞队列里,队满时它直接抛出异常,不等待。
array(数组)
可以按位置访问的一组存储单元;第6课用它解释内部表的位置。
hash(哈希)
根据输入计算散列值;映射实现用相关计算帮助定位记录,不同键仍可能落在同一位置。
bin(桶)
内部表中同一位置上的一组记录。
hash collision(哈希冲突)
本课指不同键落在内部表同一位置的情况,仍需继续区分具体记录。
node(节点)
内部保存记录并参与连接或树结构的单元。
linked list(链表)
通过连接关系组织起来的一组节点。
red-black tree(红黑树)
保持结构平衡的一种查找树;第6课只解释用途,不要求实现或背转换阈值。
resize(扩容)
内部表改用更多位置并迁移记录;不是业务允许保存数量的自动上限控制。
forwarding node(转发节点)
迁移后的旧位置留下的指向新表的信息,用于继续查找或更新。
Segment(分段锁)
旧版并发映射中的分段设计;现代版本保留兼容结构不代表日常操作仍采用旧实现。
Hashtable(旧式同步哈希表)
JDK 1.0 起的线程安全映射,主要方法用 synchronized(内置同步关键字)修饰,所有操作争用同一把锁;新代码一般改用 ConcurrentHashMap(并发哈希映射)。
mappingCount(映射数量方法)
ConcurrentHashMap(并发哈希映射)专有,返回 long 类型的记录数;官方说明它是估计值,并推荐用它代替 size(数量方法)。
CounterCell(计数单元)
ConcurrentHashMap(并发哈希映射)内部的分散计数格;多个线程同时改计数时各加各的格子,统计时把基础计数与所有格子相加。
TreeBin(红黑树桶)
桶转成红黑树后放在数组位置上的包装节点,持有树根;用自身做桶锁,并为树结构调整提供读写协调。
BlockingQueue(阻塞队列)
在队列空时取出方等待、队列满时放入方等待的线程安全队列接口;常用于生产者与消费者之间传递任务。
offer(尝试放入方法)
不一直等待:队满时无超时版本立即返回 false,带超时版本最多等指定时间;第5课线程池提交任务入队用的就是它。
poll(尝试取出方法)
队空时无超时版本立即返回 null,带超时版本最多等指定时间再返回 null;返回 null 在阻塞队列里专门表示“没取到”。
take(阻塞取出方法)
取出并移除队头元素;队列为空时一直等到有元素,等待中可被中断。
Condition(条件等待室)
附属于一把显式锁的等待室;线程调用 await 会放开锁并睡眠,被 signal 叫醒后要重新拿到锁才继续。
spurious wakeup(虚假唤醒)
线程没有被 signal 叫醒却自己醒来;所以等待条件时必须放在循环里反复检查。
producer-consumer(生产者-消费者模式)
一部分线程只往队列放任务,另一部分线程只从队列取任务处理;队列夹在中间,让两边速度不同也能配合。
bounded queue(有界队列)
有固定容量上限的队列;满了以后放入方必须等待、失败或被拒绝,用来防止任务无限堆积。
unbounded queue(无界队列)
没有实际容量上限的队列;不会因为满而拒绝,但任务一直堆积会耗尽内存。
backpressure(背压)
下游处理不过来时,让上游放慢或被拒绝,而不是让中间的队列悄悄变大。
poison object(结束标记对象)
生产者最后放进队列的特殊元素,消费者取到它就退出;阻塞队列本身没有“关闭”操作,通常用这种办法通知停止。
remainingCapacity(剩余容量方法)
还能放入多少元素而不必等待;没有容量上限的队列报告 Integer.MAX_VALUE。
PriorityBlockingQueue(优先级阻塞队列)
按优先级而不是先进先出取出的无界阻塞队列;本课只点名。
DelayQueue(延迟队列)
元素到期后才能被取出的无界阻塞队列;本课只点名。
CompletableFuture(可编排的异步结果)
Java 8 引入的类,同时实现 Future(异步结果句柄)与 CompletionStage(完成阶段):既能等结果,也能在结果出来后自动接着做下一步、合并多个结果、统一处理异常。
CompletionStage(完成阶段接口)
描述异步计算中的一步:上一步完成后,触发这一步执行;thenApply、thenCompose 等编排方法都定义在这里。
Executor(执行器接口)
只有一个 execute 方法、负责“把任务交给某个线程执行”的接口;线程池是它最常见的实现。CompletableFuture 的异步方法可以传入一个 Executor 指定在哪里执行。
supplyAsync(异步取值方法)
提交一个有返回值的任务异步执行,立即返回 CompletableFuture;不传 Executor 时在 ForkJoinPool 公共池执行。
runAsync(异步执行方法)
提交一个没有返回值的任务异步执行;其他规则与 supplyAsync 相同。
thenApply(结果变换方法)
上一步正常完成后,用它的结果算出一个新结果;类似对结果做一次映射。
thenAccept(结果消费方法)
上一步正常完成后,拿结果做一件事,不产生新结果。
thenCompose(异步衔接方法)
上一步的结果交给一个返回 CompletableFuture 的函数,直接得到里面的结果,避免“结果里套结果”;用于前后有依赖的两个异步步骤。
thenCombine(结果合并方法)
两个互不依赖的异步结果都完成后,把两个结果合成一个。
allOf(全部完成方法)
所有给定的 CompletableFuture 都完成时才完成;本身不带各任务的结果,要逐个取。任一个异常完成,它也异常完成。
anyOf(任一完成方法)
任意一个给定的 CompletableFuture 完成时就完成,结果或异常与那一个相同。
exceptionally(异常兜底方法)
只在上一步异常完成时执行,用返回值替代异常,类似 catch。
handle(结果与异常处理方法)
无论上一步成功还是失败都执行,同时拿到结果和异常,算出一个新结果。
whenComplete(完成回调方法)
无论成功还是失败都执行,适合记日志;不改变原来的结果或异常。
join(等待完成方法)
等待并取结果。CompletableFuture 的 join 在失败时抛非受检的 CompletionException(完成异常),不像 get 那样要求捕获受检异常。
CompletionException(完成异常)
非受检异常,异步链中某一步出错时,后续阶段和 join 拿到的是它,原始异常放在 getCause 里。
CancellationException(取消异常)
结果已被取消时,取结果的方法抛出的异常。
orTimeout(超时失败方法)
到时间还没完成,就以 TimeoutException(等待超时异常)异常完成;Java 9 起提供,不会停止仍在执行的任务。
completeOnTimeout(超时默认值方法)
到时间还没完成,就以给定的默认值正常完成;Java 9 起提供,不会停止仍在执行的任务。
ForkJoinPool(分治线程池)
为分治并行计算设计的线程池;它的静态公共池是 CompletableFuture 不传 Executor 时的默认执行地点。
commonPool(公共线程池)
ForkJoinPool 的全局共享实例,未另行设置时并行度为处理器数减一(至少一),工作线程是守护线程;整个应用共用,不适合放阻塞的远程调用。
daemon thread(守护线程)
只要所有非守护线程都结束,JVM 就开始关闭,不会等守护线程执行完;ForkJoinPool 公共池的工作线程属于这一类。
run-time data area(运行时数据区)
JVM 规范规定的、程序运行时用到的几块内存:程序计数器、虚拟机栈、本地方法栈、堆、方法区。前三块每个线程一份,后两块所有线程共享。和 JMM(Java 内存模型)不是一回事。
pc register(程序计数器)
每个线程一份,记录当前正在执行的字节码指令位置;执行本地方法时它的值未定义。规范没有为它列任何异常情况。
JVM stack(虚拟机栈)
每个线程一份,线程创建时一起创建;每调用一个方法压入一个栈帧,方法结束弹出。太深抛 StackOverflowError(栈溢出错误),无法分配抛 OutOfMemoryError(内存溢出错误)。
native method stack(本地方法栈)
为本地方法(非 Java 语言写的方法)服务的栈,每个线程一份;规范允许实现不提供。据 JavaGuide,HotSpot 把它和虚拟机栈合二为一。
stack frame(栈帧)
一次方法调用在栈上占的一格:局部变量表、操作数栈、指向运行时常量池的引用。只属于创建它的线程。
local variable table(局部变量表)
栈帧中按下标存放方法参数和局部变量的数组,大小编译时确定。
operand stack(操作数栈)
栈帧中做计算的临时区域:字节码指令从这里取操作数、把结果压回去。
heap(堆)
所有线程共享,所有对象实例和数组都在这里分配,由垃圾回收器自动回收;-Xms/-Xmx 设初始和最大大小,不够时抛 OutOfMemoryError: Java heap space。
method area(方法区)
所有线程共享,存放每个类的结构:运行时常量池、字段和方法信息、方法字节码。规范只规定它要有,不规定放在哪;HotSpot 在 JDK 7 及以前用永久代实现,JDK 8 起用元空间。
run-time constant pool(运行时常量池)
每个类或接口一份,由 class 文件里的常量池表转换而来,存字面量和符号引用;从方法区分配。
string constant pool(字符串常量池)
HotSpot 中保存已入池字符串(字面量与 intern 结果)的结构;JDK 7 起入池字符串分配在堆中,不在永久代。
PermGen(永久代)
JDK 7 及以前 HotSpot 对方法区的实现,是 Java 堆中的一块,大小由 -XX:MaxPermSize 固定;JDK 8 起被移除。
Metaspace(元空间)
JDK 8 起 HotSpot 存放类元数据的区域,使用本地内存,默认不设上限,可用 -XX:MaxMetaspaceSize 限制;不够时抛 OutOfMemoryError: Metaspace。
native memory(本地内存)
操作系统分给 JVM 进程、但不属于 Java 堆的内存;元空间、线程栈、直接内存都用它。
direct memory(直接内存)
NIO 直接缓冲区在 Java 堆外分配的内存,不属于规范规定的运行时数据区,可用 -XX:MaxDirectMemorySize 限制,也会内存溢出。
class metadata(类元数据)
JVM 内部表示一个类的数据:类名、父类、字段、方法、字节码等;JDK 8 起在元空间。
StackOverflowError(栈溢出错误)
线程需要的栈深度超过允许值时抛出,最常见原因是递归没有终止条件或太深。
OutOfMemoryError(内存溢出错误)
某块内存区域无法再分配时抛出;错误信息里的 Java heap space、Metaspace 等说明是哪一块不够。
TLAB(线程本地分配缓冲)
HotSpot 给每个线程在堆里预留的一小块分配区,线程在自己的区里分配对象,不用和别的线程抢;JDK 17/21 默认开启。
bump the pointer(指针碰撞)
堆内存规整时的分配方式:已用和空闲各在一边,分配就是把分界指针往空闲一边挪对象大小的距离。
free list(空闲列表)
堆内存不规整时的分配方式:维护一张可用内存块列表,从中找一块足够大的分给对象。
object header(对象头)
HotSpot 中每个对象开头的一段:标记字段(哈希码、分代年龄、锁状态等)加类型指针;在示例环境(HotSpot JDK 17/21,默认配置)下实测为 12 字节,这是实现值,不是规范规定。
Mark Word(标记字段)
对象头的第一部分,存放对象自身的运行时数据,如哈希码、GC 分代年龄、锁状态。
klass pointer(类型指针)
对象头里指向类元数据的指针,JVM 靠它知道对象是哪个类的实例;开启压缩类型指针时占 4 字节。
padding(对齐填充)
HotSpot 把对象大小补齐到对齐边界(默认 8 字节)的占位部分,本身没有含义。
compressed class pointers(压缩类型指针)
让对象头中的类型指针只占 4 字节的 HotSpot 选项(-XX:+UseCompressedClassPointers),64 位 JDK 17/21 默认开启。
intern(字符串入池方法)
String.intern:池里已有相等的字符串就返回池里那个,没有就把它放进池再返回。
javap(字节码查看工具)
JDK 自带的命令行工具,javap -c 可以看到 class 文件里每个方法的字节码指令。
InnoDB(事务存储引擎)
本课表使用的存储引擎,显式主键用于聚簇索引。
composite index(联合索引)
按指定列顺序组织的多列索引;前列相同的记录再按后列排序。
clustered index(聚簇索引)
末端保存行数据的索引;本课显式主键决定其组织顺序。
secondary index(二级索引)
聚簇索引之外的索引;本课包含索引列及主键。
leftmost prefix(最左前缀)
从联合索引第一列开始连续取的列组合。
covering index(覆盖索引)
索引包含某条查询所需的所有列,是查询与索引之间的关系。
table lookup(回表)
本课指通过二级索引取得主键,再访问聚簇索引获取整行信息。
ICP(索引条件下推)
先在索引记录上检查可下推条件,减少后续整行读取。
skip scan(跳跃扫描)
在满足限制并且成本合适时枚举前缀值,对后续列进行范围查找。
optimizer(查询优化器)
比较候选访问方案并选择执行计划的组件。
leaf page(叶子页)
树形索引末端用于保存索引记录的页。
full table scan(全表扫描)
读取表记录并检查条件的访问方式;小表或大比例读取时可能更合适。
ACID(事务四项属性)
原子性、一致性、隔离性、持久性;数据库机制与正确的事务使用共同支持可靠业务。
consistency(一致性)
数据库语境中操作应维持约束与业务规则;应用仍要正确实现业务条件。
isolation(隔离性)
并发事务之间的可见性与干扰规则,具体行为取决于隔离级别和读写方式。
durability(持久性)
成功提交的数据可在故障恢复后保留,实际保证依赖可靠性配置和存储条件。
autocommit(自动提交)
连接默认开启的模式;没有显式事务时普通单条数据修改分别提交。
READ UNCOMMITTED(读未提交)
可能读到其他事务未提交修改的隔离级别。
READ COMMITTED(读已提交)
每次一致性读建立新的快照,可看到前次读取后别人新提交的修改。
REPEATABLE READ(可重复读)
同一事务普通一致性读复用首次此类读建立的快照;本事务自己的修改可见。
SERIALIZABLE(可串行化)
更强隔离级别;在本课引擎关闭自动提交时,普通查询会转为共享锁定读。
consistent read(一致性读)
按快照规则读取可见已提交版本,同时可以看到本事务此前的修改。
snapshot read(快照读)
本课指普通一致性读,按可见版本规则取值,不自动提供写入独占。
locking read(锁定读)
读取并加锁以保护后续相关操作;冲突时可能等待,事务结束后释放锁。
current read(当前读)
本课用于区别快照读,指按最新可用记录进行的锁定读取和写操作。
MVCC(多版本并发控制)
利用旧版本信息按可见性规则提供一致性读取,不是复制整张表。
dirty read(脏读)
读取了其他事务尚未提交的修改。
non-repeatable read(不可重复读)
同一事务重复读同一行,其他事务提交使读取值变化。
phantom read(幻读)
同一事务重复同样查询条件时,其他事务的修改使结果集合变化。
duplicate-key error(重复键错误)
写入违反键的唯一性要求;本课普通插入只回滚失败语句。
deadlock(死锁)
事务互相等待对方持有资源形成无法推进的循环;检测后数据库选择受害事务回滚。
lock wait timeout(锁等待超时)
等待冲突锁超过时限;本课引擎默认只撤销失败语句,整事务回滚可由配置改变。
implicit commit(隐式提交)
某些语句隐含结束当前事务,例如本课所列改表和开始新事务操作。
Read View(读视图)
普通一致性读判断版本可见性所用的信息,包含建立时活跃读写事务名单、编号边界及创建者。
undo log(撤销日志)
保存撤销修改、还原旧行所需的信息,也支持一致性读重建旧版本。
version chain(版本链)
沿撤销信息逐步还原较旧行版本的逻辑链,不等于每次保存整张表。
DB_TRX_ID(最近修改事务编号)
聚簇索引记录中的最近修改事务标识,不是业务主键或提交顺序。
DB_ROLL_PTR(回滚指针)
指向撤销记录的字段,可用于还原更新前的行。
DB_ROW_ID(隐藏行编号)
InnoDB需要生成隐藏聚簇索引时使用的行标识。
update undo(更新撤销信息)
更新产生的撤销信息,写事务提交后仍可能被旧快照需要。
purge(历史清理)
在相关历史不再需要时后台清理旧版本等信息的过程。
record lock(记录锁)
加在索引记录上的锁;完整唯一键等值命中已有记录是只需记录锁的典型情形。
gap lock(间隙锁)
保护索引记录之间或两端空隙、阻止向其中插入的锁;纯间隙锁可以共存。
next-key lock(临键锁)
某条索引记录上的记录锁与它前面间隙锁的组合。
shared lock(共享锁)
同一记录上可由多个事务兼容持有的S锁,与别人的X记录锁冲突。
exclusive lock(排他锁)
在同一记录上与别人的S或X记录锁冲突的X锁。
intention lock(意向锁)
协调表级与记录级加锁的表级标记;IX可互相兼容,不等于整表X锁。
insert intention lock(插入意向锁)
插入前表示插入位置的锁请求,会受已有间隙保护阻挡;不同位置的插入不一定互相等待。
lock wait(锁等待)
事务的操作因所需锁与已有锁冲突而暂时不能继续,不一定构成死锁。
buffer pool(缓冲池)
InnoDB在内存中缓存表和索引页面的区域;页面修改可以先发生在这里。
page(页)
数据库组织和读写数据的基本块;一个页可以容纳多条记录。
dirty page(脏页)
内存中已修改、对应数据文件尚未包含这些变化的页面;与事务是否提交是两个概念。
redo log(重做日志)
保存重建页面修改所需信息的日志,InnoDB用它恢复尚未反映到数据文件的变化;有redo不等于事务已提交。
log buffer(日志缓冲区)
内存中保存待写入日志文件的redo内容的区域,与缓存数据页的缓冲池不同。
binlog(二进制日志)
MySQL服务器记录可重放变更事件的日志,服务复制和备份后的恢复,并参与内部提交协调。
binary log(二进制日志)
binlog的全称;它记录数据库变更事件,不是把所有SQL原样保存。
WAL(预写日志)
数据页写回文件前,先可靠保存恢复该页修改所需的日志;这里讨论InnoDB的redo。
checkpoint(检查点)
标记一个恢复起点;此前的页面修改已反映在数据文件中,恢复从此处继续应用日志。
crash recovery(崩溃恢复)
数据库意外退出后,根据日志重建需要的页面变化,并按事务最终结果完成提交或撤销修改。
two-phase commit(两阶段提交)
通过准备和最终决定协调参与方的结果;本课用于同一MySQL实例的InnoDB与binlog。
slow query log(慢查询日志)
执行时间超过阈值、且检查行数达到下限的语句被写入的日志;默认关闭,用于找出需要优化的语句。
execution plan(执行计划)
优化器决定的查询方式:用哪个索引、怎样访问表、估计检查多少行、是否额外排序等。
EXPLAIN ANALYZE(实际执行并分析)
真正执行语句,并对每一步给出估计与实际的行数、耗时和循环次数;只在测试环境对查询语句使用。
EXPLAIN(查看执行计划的语句)
放在SQL前面,返回执行计划而不返回查询结果;rows等数字是估计值。
filesort(额外排序)
不能按索引顺序直接得到结果时,先取出符合条件的行再排序;放得进内存就在内存中完成,不一定写磁盘。
implicit type conversion(隐式类型转换)
比较两边类型不同时数据库自动转换;字符串列与数字比较时,列上的索引不能用于快速查找。
functional index(函数索引)
MySQL 8.0.13起支持的索引,存表达式的计算结果而不是列的原始值;查询表达式需与定义一致。
deep pagination(深分页)
偏移量很大的分页,例如LIMIT 19980, 20;数据库要先读过前面的行再丢掉,页码越大越慢。
cursor pagination(游标分页)
记住上一页最后一条的排序字段和id,下一页从它之后读,不再按偏移量跳过;不能直接跳到任意页。
deferred join(延迟关联)
子查询先在覆盖索引上翻页只取主键,再用这些主键回表取整行,减少被跳过行的回表。
Redis(内存数据存储)
把数据放在内存中的数据结构存储,按键存取;值可以是字符串、哈希、列表、集合、有序集合等类型,常放在数据库前做缓存。
TTL(剩余存活时间)
键还剩多少秒过期;TTL命令返回−1表示没有过期时间,−2表示键不存在。
Sorted Set(有序集合)
不重复成员各带一个分数、按分数排序的Redis类型;由跳表和哈希表组成,适合排行榜和按时间处理的任务。
skip list(跳表)
有序集合用来按分数保持顺序、支持范围查询的结构;添加元素为O(log N)。
listpack(紧凑列表编码)
Redis 7.0起小的哈希、有序集合、列表等使用的省内存内部编码;超过阈值自动转为普通编码。
Spring Data Redis(Spring 的内存数据存储访问模块)
Spring提供的Redis客户端封装;RedisTemplate按类型提供opsForValue等操作入口。
Hash(哈希)
Redis中“字段→值”的集合类型,适合表示对象或一组计数器,可只修改单个字段。
Set(集合)
Redis中不重复、无顺序的字符串集合类型,适合去重、表示关系和求交并差。
RDB(快照文件)
Redis按save规则或BGSAVE生成的某一时刻整个数据集的二进制快照,默认文件dump.rdb;非正常停机会丢最近几分钟。
AOF(追加写日志)
Redis把每条修改数据的命令追加到文件末尾,重启时重放重建数据;7.0起为基础文件+增量文件+清单文件。
fork(创建子进程)
操作系统复制当前进程得到子进程;Redis用它让子进程写RDB或重写AOF,父进程继续服务,开销主要是复制页表。
copy-on-write(写时复制)
fork后父子进程共用内存页,哪一页被修改才复制哪一页;子进程因此看到fork那一刻的数据。
fsync(强制同步到磁盘)
让操作系统把文件缓存中的数据真正写到磁盘;对应第14课日志的第③阶段。
appendfsync(追加日志刷盘策略)
Redis配置项:always每批命令后fsync、everysec每秒一次(默认)、no交给操作系统。
BGSAVE(后台保存)
让Redis fork子进程在后台生成RDB,父进程继续服务;SAVE则在主线程同步保存并阻塞所有客户端。
BGREWRITEAOF(后台重写追加日志)
让Redis fork子进程按当前内存数据生成最短命令序列,替换冗长的AOF。
rewrite(重写)
按当前数据集重新生成重建所需的最短命令序列,解决AOF越写越大的问题。
cache-aside(旁路缓存)
读时先查缓存,未命中再查数据库并写回缓存;写时先改数据库再删缓存。
cache miss(缓存未命中)
要读的数据不在缓存里,需要回到数据库读取。
Bloom filter(布隆过滤器)
用很小的固定内存判断元素是否在集合中;说不存在一定不存在,说存在可能误判;Redis 8起内置,没有删除命令。
Cuckoo filter(布谷鸟过滤器)
与布隆过滤器类似的概率型结构,查询更快且支持删除(CF.DEL)。
thundering herd(惊群)
大量请求几乎同时需要同一个未缓存的资源,一起涌向下游;国内常说的缓存击穿属于这种情况。
request coalescing(请求合并)
对同一个未缓存的资源,同一时刻只让一个请求去下游取,其他请求等它的结果。
negative cache(负缓存)
把错误或“查不到”的结果也缓存起来(用单独的较短过期时间),避免反复冲击下游。
Redis Sentinel(哨兵)
不使用Redis Cluster时为Redis提供高可用:主节点故障时自动把副本提升为新主节点并通知应用。
Redis Cluster(集群)
把数据自动分片到多个Redis节点,部分节点故障时仍可服务,多数主节点不可用时整体不可用。
来源:JavaGuide 内存模型资料(本地资料)、同步官方摘录、线程池官方摘录、映射官方摘录、阻塞队列官方摘录、CompletableFuture(可编排的异步结果) 官方摘录;屏障模型参考 JavaGuide 的内存模型解释,具体平台指令需另行核对。