在 Java 中,线程池会使用固定数量或者可变数量的线程来执行任务,但无论是固定数量还是可变数量的线程,其线程数量都远远小于任务数量,面对这种情况线程池可以通过线程复用让同一个线程去执行不同的任务,那么线程复用原理是什么呢?
Redis Linked List
链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度。
Redis 的 List 对象的底层实现之一就是链表。C 语言本身没有链表这个数据结构,所以 Redis 自主设计了一个链表数据结构。
wait / notify / notifyAll 方法的使用事项
三个问题:
- 为什么
wait
方法必须在synchronized
同步代码块中使用?- 为什么
wait / notify / nojtifyAll
被定义在 Object 类中,而sleep
定义在 Thread 类中?wait / notify
和sleep
方法的异同?
Java 中创建线程到底有几种方法?
创建线程的方式到底有几种?
可能你的答案是 2 种、3 种或者是 4 种,但是本质上来说创建线程只有一种方式。
Kafka Basic
体系结构
刷一道有意思的算法题 LC31
题目链接:31. 下一个排列
整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。
- 例如,
arr = [1,2,3]
,以下这些都可以视作arr
的排列:[1,2,3]
、[1,3,2]
、[3,1,2]
、[2,3,1]
。
整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。
- 例如,
arr = [1,2,3]
的下一个排列是[1,3,2]
。 - 类似地,
arr = [2,3,1]
的下一个排列是[3,1,2]
。 - 而
arr = [3,2,1]
的下一个排列是[1,2,3]
,因为[3,2,1]
不存在一个字典序更大的排列。
给你一个整数数组 nums
,找出 nums
的下一个排列。
必须原地修改,只允许使用额外常数空间。
Simple-Dynamic-String (SDS)
字符串在 Redis 中是非常常见的数据类型,KV 键值对中的键是字符串类型,值有时也是字符串类型。
Redis 没有直接使用 C 语言传统的字符串 (char*
)
表示,而是自主封装了 SDS 的数据结构来表示字符串,也就是说 Redis 的
String 数据类型的底层数据结构是 SDS。
为什么 Redis 选择自主设计 SDS 呢?很显然是 C 原生字符串存在一些缺陷无法接受。
JVM 运行时数据区
内存是非常重要的系统资源,是硬盘和 CPU 的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM 内存布局规定了 Java 在运行过程中内存申请、分配、管理的策略,保证了 JVM 的高效稳定运行。不同的 JVM 对于内存的划分方式和管理机制存在着部分差异。