为什么 Netty 不使用 ThreadLocal 而是自定义了一个 FastThreadLocal ?我们先来思考下 ThreadLocal 有哪些不够好的地方,如果要改都需要改哪些实现。
ThreadLocal hash 冲突的线性探测法不好,还有 Entry 的弱引用可能会发生内存泄漏,这些都和 ThreadLocalMap 有关,所以需要搞个新的 map 来替换 ThreadLoca...
什么是 Java 的 TransmittableThreadLocal?这玩意是阿里开源的一个组件,原生的 ThreadLocal 不支持在线程池中传递本地变量,所以弄了个这个来实现下这个需求
接下来我们来详细探讨一下
缘由任何一个组件的出现必有其缘由,知其缘由背景才能更深刻地理解它。
我们知道 ThreadLocal 的出现就是为了本地化线程资源,防止不必要的多线程之间的竞争。
在有些场...
Java 中什么情况会导致死锁?如何避免?回答重点这是一个非常典型的八股文,即操作系统中的经典理论,死锁的发生必须满足以下四个条件,这些条件被称为“死锁的必要条件”:
互斥条件:每个资源只能被一个线程占用。
占有和等待:线程在持有至少一个资源的同时,等待获取其他资源。
不可抢占:线程所获得的资源在未使用完毕之前不能被其他线程抢占。
循环等待:多个线程形成一种头尾相接的循环等待资源关系。
...
Java 中的 wait、notify 和 notifyAll 方法有什么作用?回答重点这三个方法都属于 Object 内种定义的方法,主要用于线程之间的通信和同步,且需要在 synchronized 修饰的方法或同步块中使用。
wait() 使得当前线程进入等待状态,且会释放锁。
notify() 会顺序(在 hotspot 的实现中)唤醒一个调用 wait 后等待的线程。
notifyA...
ThreadLocal 的缺点?回答重点正常情况下使用 ThreadLocal 是没什么问题的,但是如果极端情况下,数据比较多,则可能会出现以下几个问题:
内存泄露问题
ThreadLocal 中的 ThreadLocalMap Hash 冲突用的是线性探测法,效率低
ThreadLocal 主动清理的开销问题
扩展知识内存泄漏问题ThreadLocal 的生命周期和线程的生命周期绑定,...
什么是 Java 中的 ABA 问题?回答重点ABA 问题是指在多线程环境下,某个变量的值在一段时间内经历了从 A 到 B 再到 A 的变化,这种变化可能被线程误认为值没有变化,从而导致错误的判断和操作。ABA 问题常发生在使用 CAS(Compare-And-Swap) 操作的无锁并发编程中。
补充解释 CAS ABA 问题影响
CAS 是一种无锁算法,用于在多线程环境下实现原子操作。...
Java 中 volatile 关键字的作用是什么?回答重点volatile 它的主要作用是保证变量的可见性和禁止指令重排优化。
1)可见性(Visibility):
volatile 关键字确保变量的可见性。当一个线程修改了 volatile 变量的值,新值会立即被刷新到主内存中,其他线程在读取该变量时可以立即获得最新的值。这样可以避免线程间由于缓存一致性问题导致的“看见”旧值的现象。
...
Java 中的序列化和反序列化是什么?回答重点序列化是将对象转换为字节流的过程,这样对象可以通过网络传输、持久化存储或者缓存。Java 提供了 java.io.Serializable 接口来支持序列化,只要类实现了这个接口,就可以将该类的对象进行序列化。
反序列化是将字节流重新转换为对象的过程,即从存储中读取数据并重新创建对象。
其它
应用场景:包括网络传输、远程调用、持久化存储(如保存到...
MySQL 插入一条 SQL 语句,redo log 记录的是什么?回答重点因为 redo log 是物理日志,记录“某页(Page)某位置的数据被修改为某值”。它不记录逻辑操作(如 “插入一行”),而是直接记录对页的变更。所以在插入操作中,redo log 记录的是事务在数据页上的修改
数据页的插入点、记录的偏移量和插入的实际数据并更新页目录、页头等元数据。
扩展知识插入操作 redo l...
SQL 中 select、from、join、where、group by、having、order by、limit 的执行顺序是什么?回答重点
执行顺序
SQL 子句
说明
1
FROM
确定数据源,执行表连接操作。
2
JOIN
执行连接操作,结合多张表的数据。
3
WHERE
过滤不符合条件的行。
4
GROUP BY
将数据按指定的列分组。
5
HAVIN...
MySQL 中 LIMIT 100000000, 10 和 LIMIT 10 的执行速度是否相同?回答重点速度差很多,limit 10 快很多!
原因如下:
1)LIMIT 100000000, 10 需要先处理(通常是读取并跳过)前 100000000 条记录,然后再获取到需要的 10 条记录,开销成本很大,因为需要扫描 100000000 数据才能得到后面的 10 条数据,会导致大量的磁...
MySQL 中 DATETIME 和 TIMESTAMP 类型的区别是什么?回答重点存储方式:
DATETIME:以字符串形式存储,范围为 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59',占用 8 字节。
TIMESTAMP:以 Unix 时间戳形式存储,范围为 '1970-01-01 00:00:01...
为什么阿里巴巴的 Java 手册不推荐使用存储过程?回答重点1)可移植性差
数据库依赖性:存储过程是在数据库服务器上执行的,通常使用数据库特定的 SQL 方言和功能,这会导致应用程序的数据库依赖性增加,迁移到其他数据库系统时有成本。
跨平台问题:不同的数据库系统实现存储过程的方式和支持的功能不完全相同,维护比较复杂。
2)调试困难
调试工具有限:相比应用层代码,数据库层的存储过程缺乏良...
数据库的三大范式是什么?回答重点第一范式(1NF):
确保每个列的值都是原子值,表中的每个字段只能包含单一的数据项,不允许重复的列和多值字段。
第二范式(2NF):
在满足第一范式的基础上,确保表中的每个非主键字段完全依赖于主键,而不是部分依赖。即,非主键字段必须依赖于整个主键。
第三范式(3NF):
在满足第二范式的基础上,确保非主键字段之间不依赖,即消除传递依赖。所有非主键字段...
在 MySQL 中,你使用过哪些函数?回答重点这道题目被问的几率不是很大,大家可以熟悉下,可以在实际开发中使用。
以下列举一些常用的函数类别:
1)字符串函数,用于处理文本数据:
CONCAT:连接字符串。
SUBSTRING:提取子字符串。
LENGTH:返回字符串的长度。
REPLACE:替换字符串中的子字符串。
UPPER 和 LOWER:将字符串转换为大写或小写。
TRIM:去除字...
MySQL 中 TEXT 类型最大可以存储多长的文本?回答重点TEXT 是非标准字符串类型,除了它还有 TINYTEXT、MEDIUMTEXT 和 LONGTEXT,一般我们存储一些不确定的较长文本才会使用到它们,例如文章之类的。
它们的存储的文本长度汇总如下:
1)TINYTEXT:最大长度为 255 字节。
2)TEXT:最大长度为 65,535 字节(约 64 KB)。
3)MEDIU...
MySQL 中 AUTO_INCREMENT 列达到最大值时会发生什么?回答重点在 MySQL 中,如果表定义的自增 ID 到达上限后,再申请下一个 ID,得到的值不变! 因此会导致报重复值的错误。
扩展知识自增 ID 上限实验例如 int 是 4 个字节,上限是 2 的 32 次方 -1,即 2147483647,当到达这个值的之后,下次插入得到的还是这个值,来看一下实验:
123456c...
在 MySQL 中存储金额数据,应该使用什么数据类型?回答重点在数据库中业界常用两种类型来存储金额:bigint 和 decimal。
1)bigint 代码中用 long。
范围:可以存储的整数范围为 -2^63 到 2^63 - 1(在 MySQL 中为 64 位有符号整数)
存储空间:占用 8 字节(64 位)
精度:精确存储整数,但不支持小数部分,存储的金额单位是分
2)deci...
什么是数据库的视图?回答重点数据库的视图是一个虚拟表,它并不存储实际的数据,而是通过查询其他表的数据来生成的。视图可以简化复杂的查询、增强数据安全性(限制访问某些数据)以及提供数据的不同表示方式。
它可以包含一个或多个表的数据,并且可以对这些数据进行筛选、计算、排序等操作。
扩展知识视图的作用
简化复杂查询:视图可以将复杂的查询封装成一个简单的视图,使得用户在查询数据时更加方便。
安全性:通...
什么是数据库的游标?回答重点
这道题面试遇到的几率比较低,但是游标这个概念还是需要了解。
数据库游标是一个数据库对象,使得应用程序可以逐行访问查询结果集,而不仅仅是一次性处理所有结果。它允许开发者在结果集中的行之间移动,方便进行复杂的数据操作,比如更新或删除特定的行。
扩展知识游标的作用和性能问题
逐行处理:游标允许逐行处理查询结果集,在需要对结果集中的每一行进行复杂操作时,非常有用。
灵...
为什么不推荐在 MySQL 中直接存储图片、音频、视频等大容量内容?回答重点MySQL 是关系型数据库,它设计的初衷是高效处理结构化和关系型数据,所以存储大容量的内容本身就不是它的职责所在,因此这方面的能力也不够。
应该将大容量文件存储在文件系统或云服务提供的对象存储服务中,仅在数据库中存储文件的路径或 URL 即可。
扩展知识数据库本身性能问题
数据库性能:存储和检索大容量的二进制数据(如...
在什么情况下,不推荐为数据库建立索引?回答重点一般有以下几种情况不推荐建立索引:
1)对于数据量很小的表
当表的数据量很小(如几百条记录)时,建立索引并不会显著提高查询性能,反而可能增加管理的复杂性。
2)频繁更新的表
对于频繁进行插入、更新和删除操作的表,索引会导致额外的维护开销,因为每次数据变更时都需要更新索引,这会影响性能。
3)执行大量的 SELECT *
此时二级索引可...
相比于 Oracle,MySQL 的优势有哪些?回答重点与 Oracle 相比,MySQL 有以下优势:
1)MySQL 有免费版本,成本低,Oracle 数据库的许可费用和维护成本较高。
2)MySQL 是开源的,有广泛的社区支持和丰富的文档资源,能快速上手和解决问题。
3)MySQL 适合小型和中型应用,相比 Oracle 资源占用较少,更加轻量。
而 Oracle 在处理大...
MySQL 中 VARCHAR(100) 和 VARCHAR(10) 的区别是什么?回答重点两者的区别就是能存储的字符串长度上限不同,字符数上限是由定义中的括号内的数字决定的。
VARCHAR(100) 最多可以存储 100 个字符。
VARCHAR(10) 最多可以存储 10 个字符。
两者存储相同字符串时占用的空间是一样的。除了存储字符本身外,还需要额外的 1 或 2 个字节来记录字...
MySQL 中 EXISTS 和 IN 的区别是什么?回答重点基本功能:
EXISTS 用于判断子查询是否返回任何行,通常用于检查某个条件是否满足。
IN 用于检查某个值是否在指定的集合中,可以是一个子查询或静态值列表。
性能差异:
EXISTS 一旦找到匹配行就会立即返回,通常在子查询返回较大数据集时性能更好。
IN 通常会评估整个子查询并构建一个值列表,然后再进行匹配,在处理较大数...
什么是 Write-Ahead Logging (WAL) 技术?它的优点是什么?MySQL 中是否用到了 WAL?回答重点WAL(Write-Ahead Logging)技术是一种数据库事务日志管理技术,它确保在修改真正的数据之前,先将修改记录写入日志。这使得即使系统崩溃,通过日志也能恢复数据。保证了数据的持久性和一致性。
WAL 它的核心思想就是先写日志,再写数据,大致执行流程如下:
1...
你们生产环境的 MySQL 中使用了什么事务隔离级别?为什么?回答重点MySQL 数据库的默认隔离级别是 RR(可重复读),但是很多大公司把隔离级别改成了 RC(读已提交),主要原因是为了提高并发和降低死锁概率。
为了解决幻读的问题 RR 相比 RC 多了间隙锁(gap lock)和临键锁(next-key lock)。而 RC 中修改数据仅用行锁,锁定的范围更小,因此相比而言 RC 的并发...
MySQL 中 InnoDB 存储引擎与 MyISAM 存储引擎的区别是什么?回答重点MyISAM :1)MyISAM 是基于 ISAM 引擎而来的,支持全文检索、数据压缩、空间函数,不支持事务和行级锁,只有表级别锁,它适用于 OLAP 场景,也就是分析类的,基本上都是读取,不会有什么写入动作的场景。
2)MyISAM 的索引也是 B+ 树,只是不像 InnoDB 那种叶子节点会存储完整的数...
如何实现数据库的不停服迁移?回答重点迁移想着很简单,不就是把一个库的数据迁移到另一个库吗?
但是实际上有很多细节,在面试中我们可以假装思考下,然后向面试官复述以下几点:
首先关注量级,如果是几十万的数据其实直接用代码迁移,简单核对下就结束了。如果数据量大那么才需要好好设计方案。
不停服数据迁移需要考虑在线数据的插入和修改,保证数据的一致性。
迁移还需要注意回滚,因为一旦发生问题需要及时切换...
MySQL 的查询优化器如何选择执行计划?回答重点选择执行计划一般需要经过以下几个步骤:
1)将 SQL 语句解析为解析树。
2)预处理,包括语法检查、权限验证、查询重写(例如常量表达式计算、子查询展开等)。
3)生成多个执行计划,并选择成本最低的执行计划。
扩展知识优化器成本的计算方式实际上优化器的内部实现方式比较复杂,我们仅需着重关心它的成本计算,这样能更好地理解 SQL 的执行计划是如...