摘要: 线程池有五种状态:RUNNING, SHUTDOWN, STOP, TIDYING, TERMINATED。 RUNNING:接收并处理任务。 SHUTDOWN:不接收但处理现有任务。 STOP:不接收也不处理任务,同时终端当前处理的任务。 TIDYING:所有任务终止,线程池会变为 TIDYING 阅读全文
posted @ 2023-03-17 23:02 残城碎梦 阅读(164) 评论(0) 推荐(0) 编辑
摘要: DNS解析:将域名解析成IP地址 TCP连接:TCP三次握手 发送HTTP请求 服务器处理请求并返回HTTP报文 浏览器解析渲染页面 连接结束:TCP四次挥手 DNS解析 在浏览器输入URL后,首先要经过域名解析。浏览器通过向 DNS 服务器发送域名,DNS 服务器查询到与域名相对应的 IP 地址, 阅读全文
posted @ 2023-03-17 22:56 残城碎梦 阅读(12) 评论(0) 推荐(0) 编辑
摘要: 所谓HTTP协议的无状态性是指服务器的协议层无需为不同的请求之间建立任何相关关系,它特指的是协议层的无状态性。但是这并不代表建立在HTTP协议之上的应用程序就无法维持状态。 应用层可以通过会话Session来跟踪用户请求之间的相关性,服务器会为每个会话对象绑定一个唯一的会话ID,浏览器可以将会话ID 阅读全文
posted @ 2023-03-17 22:56 残城碎梦 阅读(16) 评论(0) 推荐(0) 编辑
摘要: 当程序使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、链接、初始化三个步骤对该类进行类加载。 加载 类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象。类的加载过程是由类加载器来完成,类加载器由JVM提供。我们开发人员也可以通过继承ClassLo 阅读全文
posted @ 2023-03-17 22:52 残城碎梦 阅读(83) 评论(0) 推荐(0) 编辑
摘要: 线程间的通信方式 同步 指多个线程通过synchronized关键字这种方式来实现线程间的通信。 这种方式,本质上就是“共享内存”式的通信。多个线程需要访问同一个共享变量,谁拿到了锁(获得了访问权限),谁就可以执行。 while轮询的方式 线程A不断地改变条件,线程ThreadB不停地通过while 阅读全文
posted @ 2023-03-17 22:34 残城碎梦 阅读(17) 评论(0) 推荐(0) 编辑
摘要: 为什么要拆分数据库? 数据库负载和数据量大 拆分数据库是有讲究的,必须:先水平切分,然后垂直切分。 什么是垂直切分? 垂直切分是根据业务来拆分数据库,同一类业务的数据表拆分到一个独立的数据库,另一类的数据表拆分到其他数据库。 比如说一个新零售的电商数据库,我们可以把跟商品相关的数据表拆分成一个数据库 阅读全文
posted @ 2023-03-17 15:23 残城碎梦 阅读(40) 评论(0) 推荐(0) 编辑
摘要: 联合索引失效的条件 联合索引又叫复合索引。两个或更多个列上的索引被称作复合索引。 对于复合索引:MySQL从左到右使用索引中的字段,一个查询可以只使用索引中的一部分,但只能是最左侧部分。例如索引是key index (a,b,c)。可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b 阅读全文
posted @ 2023-03-17 11:03 残城碎梦 阅读(307) 评论(0) 推荐(0) 编辑
摘要: Redis字符串的实现 Redis虽然是用C语言写的,但却没有直接用C语言的字符串,而是自己实现了一套字符串。 Redis构建了一个叫做简单动态字符串(Simple Dynamic String),简称SDS。 Redis的字符串也会遵守C语言的字符串的实现规则,即最后一个字符为空字符。然而这个空字 阅读全文
posted @ 2023-03-17 10:44 残城碎梦 阅读(23) 评论(0) 推荐(0) 编辑
摘要: 某一个key可能会在某些时间点被超高并发地访问,是一种非常"热点"的数据,这个key失效,导致并发访问数据库。 与缓存雪崩的区别在于这里针对某一key缓存,前者则是很多key,这里是指同一个key。 解决方案: 设置热点数据永远不过期 加互斥锁,如果缓存中没有,只能一个线程去拿到锁,并且去DB中查询 阅读全文
posted @ 2023-03-17 10:12 残城碎梦 阅读(23) 评论(0) 推荐(0) 编辑
摘要: JDK7和JDK8中HashMap的大致变化是: 1.7中采用数组+链表,1.8采用的是数组+链表/红黑树,即在1.7中链表长度超过一定长度后就改成红黑树存储。 1.7扩容时需要重新计算哈希值和索引位置,1.8并不重新计算哈希值,巧妙地采用和扩容后容量进行&操作来计算新的索引位置。 1.7是采用表头 阅读全文
posted @ 2023-03-17 09:31 残城碎梦 阅读(75) 评论(0) 推荐(0) 编辑
摘要: HashSet是基于HashMap实现的,默认构造函数是构建一个初始容量为16,负载因子为0.75 的HashMap。封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了 阅读全文
posted @ 2023-03-17 08:54 残城碎梦 阅读(21) 评论(0) 推荐(0) 编辑
摘要: 同步性 Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们 阅读全文
posted @ 2023-03-17 08:53 残城碎梦 阅读(9) 评论(0) 推荐(0) 编辑
摘要: HashMap和HashTable都实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。 HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。 HashMap扩容时是当前容量翻倍:capacity*2,Hasht 阅读全文
posted @ 2023-03-17 08:49 残城碎梦 阅读(14) 评论(0) 推荐(0) 编辑
摘要: 单例模式(Singleton),是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统整体的行为。 单例模式实现思路 一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用ge 阅读全文
posted @ 2023-03-17 08:43 残城碎梦 阅读(66) 评论(0) 推荐(0) 编辑
摘要: 对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的进程(或线程),另一个就是系统内核。当一个read操作发生时,它会经历两个阶段: 等待数据准备 将数据从内核拷贝到进程中 blocking IO 在linux中,默认情况下所有的socket都是bl 阅读全文
posted @ 2023-03-17 08:35 残城碎梦 阅读(29) 评论(0) 推荐(0) 编辑