- 博客(49)
- 资源 (2)
- 收藏
- 关注
原创 Linux网络相关
IP地址和子网掩码按位与运算得出网络,同一个网络的地址不需要走网关,也就是下一跳直接是对方物理地址,可以直接通信;Linux根据目标IP地址和子网掩码(Genmask)按位与运算,然后和Destination比对,如果一致就直接发送;如果不一致,走默认网关,按位与运算完了,找到下一跳。这其中,目标地址一直不变,网关找到下一跳是根据链路层mac地址找到的。IPADDR=192.168.123.101 //指定网卡的ip地址。GATEWAY=192.168.123.2 //指定网卡的网关。
2025-05-12 11:14:42
158
原创 String常量池
JDK1.7及以后,字符串常量池挪到了堆里,因此,JDK 7(以及部分其他虚拟机,例如JRockit)的intern()方法实现就不需要再拷贝字符串的实例到永久代了,既然字符串常量池已经移到Java堆中,那只需要在常量池里记录一下首次出现的实例引用即可,即。intern()方法的作用是:拿String的内容去Stringtable里查表,如果存在,则返回引用,不存在,就把该对象的"不存在不会复制,直接返回堆中对象的地址,堆中对象的地址和常量池中的地址是一样的。在字符串常量池中创建一个字符串hello。
2024-10-30 14:15:18
352
1
原创 红黑树-Java实现
不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保持平衡,而旋转是非常耗时的,由此我们可以知道。和红黑树相比,AVL树是严格的平衡二叉树,平衡条件必须满足(所有节点的左右子树高度差的绝对值不超过1)。红黑树是一种弱平衡二叉树(由于是弱平衡,可以看到,在相同的节点情况下,AVL树的高度低于红黑树)IO多路复用的epoll的实现采用红黑树组织管理的的的sockfd,以支持快速的增删改查。它的旋转次数少,所以对于搜索,插入,删除操作较多的情况下,我们就用红黑树。相对于要求严格的AVL树来说,
2024-10-23 15:40:40
235
原创 InnoDB体系结构
由于Doublewrite File中的数据是完整的,因此可以用来修复损坏的数据文件,确保数据的完整性和一致性。redolog的设计之初,是”账本的作用“,是一种操作日志,用于MySQL异常崩溃恢复使用,是InnoDB引擎特有的日志,本质上是物理日志,记录的是“在某个数据页上做了什么修改” ,但如果数据页本身已经发生了损坏,Redo Log来恢复已经损坏的数据块是无效的,数据块的本身已经损坏,再次重做依然是一个坏块。假设InnoDB正在写入一个页的数据,并且这个操作只完成了部分,比如只写入了50%的数据。
2024-10-18 15:44:01
729
原创 TCP/IP相关
RTT:Round-Trip Time,往返时延,即从发送方发送数据开始,到发送方接收到来自接收方的确认消息所经过的时间。ssthresh:全称为 slow start threshold,即满开始阈值。MSS:Maximum Segment Size,最大报文长度。RWND :(Receiver Window) 滑动窗口。2、关于慢启动、拥塞避免、超时重传、快速重传、快速恢复。CWND:Congestion Window)拥塞窗口。
2024-10-10 17:10:20
386
原创 select、epoll相关
如上图,假设进程A同时要监听socket文件描述符3、4、5,如果这三个连接都没有数据到达时,则进程A会让出CPU,进入阻塞状态,同时会将进程A的文件描述符和被唤醒时用到的回调函数组成等待队列加入到socket3、4、5的进程等待队列中。①wq:等待队列链表,如果当前进程没有数据需要处理,会把当前进程描述符和回调函数default_wake_function构造一个等待队列项,放入当前wq队列,软中断数据就绪的时候,会通过wq来找到阻塞在epoll对象上的用户进程;③rdlist:就绪的文件描述符链表。
2024-10-10 16:31:56
652
原创 ReentrantLock相关知识
(1)调用park;如果队首==队尾(h == t),则同步队列为空,不需要排队,直接取获取锁;否则执行锁重入逻辑:如果当前持有锁的线程是本线程,则state+1,state是int类型,最大值为2^31-1,如果超过此值,则抛异常,可见重入锁的最大重入次数为2^31-1。如果入队成功的节点的上一个节点是头节点(p == head),这家伙还不死心,再次尝试获取锁(tryAcquire),因为入队也是需要时间的,所以如果我排队第一,有可能前面的人已经释放了锁,我就不需要park了,再次尝试获取锁。
2024-10-08 15:59:37
1084
原创 synchronized相关知识
轻量级锁:当第二个线程过来获取锁,并且获取成功,则升级为轻量级锁,对应Markword变化如下:在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间,拷贝对象头的Markword到栈帧的Lock Record,然后将对象头的Markword更新为指向Lock Record的指针,并将Lock Record的owner指针指向对象头的Markword。当前持有锁的线程执行完毕唤醒下一个线程时,会先判断_EntryList是否为空,如果不为空就唤醒头节点,如果为空就唤醒_cxq栈顶结点。
2024-09-29 11:11:38
400
原创 可重入锁最大可以重入多少次
在ReentrantLock的实现中,非公平锁加锁时会判断当前是否有人持有锁,如果有人持有锁,会再次判断当前持有锁的是否是自己,如果是自己,将加重入锁,将记录锁的重入次数的字段state加1,然后判断是否溢出。由于int类型占4个字节,为32bit,最高位为符号位,取值范围为-2^31~2^31-1,当达到最大值2147483647后再加1会变成-2147483648,所以ReentrantLock的最大重入次数是2147483647。
2022-10-14 17:28:09
331
原创 volatile实现原理
老的CPU实现可见性主要使用总线锁,效率低。新的CPU(Intel)保证可见性实现主要借助汇编lock前缀指令来实现。lock前缀会发出LOCK#信号指令执行分为两种情况:变量所在内存缓存行(cache line)对齐:不加锁,直接修改主存值变量所在内存缓存行(cache line)没有对齐:锁缓存行,修改主存值MESI协议:当CPU写数据时,如果发现操作的变量是共享变量,即在其它 CPU 中也存在该变量的副本,会发出信号通知其它CPU将该内存变量的缓存行设置为无效。
2022-10-14 16:32:04
228
原创 MySQL索引失效的情况
13、当Mysql发现通过索引扫描的行记录数超过全表的10%-30%时,优化器可能会放弃走索引,自动变成全表扫描。11、not in和not exists。12、order by导致索引失效。1、联合索引不满足最左匹配原则。2、使用了select *5、like查询是以%开头。4、索引列参使用了函数。
2022-10-12 18:50:38
2194
1
原创 Spring扫描BeanDefinition过程
处理顺序:无ConfigurationClassPostProcessor后置处理器1、parse方法1、解析加了@PropertySources注解的类2、如果加了@ComponentScan或者ComponentScans,扫描所有的包中的类并添加到beanDefinitionMap中。
2022-09-07 15:34:58
709
原创 反转单链表
public class ReverseNode { public static void main(String[] args) { //构造链表 Node head = new Node(0); Node node1 = new Node(1); Node node2 = new Node(2); Node node3 = new Node(3); Node node4 = new Node(4);.
2021-01-05 21:03:59
108
1
原创 堆排序-Java实现
基本概念:一,完全二叉树:①深度为N的完全二叉树,从作为第一层的根节点开始,处最后一层外,第N层的元素个数都必须是2的N-1次方;②最后一行的元素,都要紧贴在左边。换句话说,每一行的元素都要从最左边开始安放,两个元素之间不能有空闲。完全二叉树的性质:最后一个非叶结点是第n/2个结点。n为完全二叉树的节点总数。当前节点为i,则左叶子节点为2*i+1;右叶子节点为2*i+2。二,堆我们假设有这样一颗完全二叉树,在满足最为完全二叉树的基础上,对于任意一个拥有父节点的子节点,其数值均不小
2021-01-05 20:59:21
120
原创 希尔排序-Java实现
import java.util.Arrays;/** * 希尔排序: * 先将序列分成较多个子序列分别进行排序,再分成较少个子序列分别进行排序,直到最后为一个序列排序。 */public class ShellSort { public static void main(String[] args) { int[] arr = {49, 38, 65, 97, 76, 13, 27, 50}; shellSort(arr); Syste.
2021-01-05 20:57:39
102
1
原创 简单插入排序
/** * 插入排序--简单插入排序 */public class InsertSort { public static void main(String[] args) { int[] arr = {12, 15, 9, 20, 6, 31, 24}; insertSort(arr); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i].
2021-01-05 20:56:28
94
1
原创 简单选择排序
一、基本思想:①从所给数组中选择最小的值,如果该位置不是该趟遍历中的起始值,则交换位置。②在剩下的数组中继续重复①。二、代码实现:import java.util.Arrays;/** * 选择排序--简单选择排序 */public class SelectionSort { public static void main(String[] args) { int[] arr = {10, 7, 2, 4, 7, 62, 3, 4, 2, 1, 8, 9,
2021-01-05 20:55:31
140
1
原创 归并排序
/** * 归并排序 */public class MergeSort { public static void main(String[] args) { int[] a = {49, 38, 65, 97, 76, 13, 27, 50}; mergeSort(a, 0, a.length - 1); System.out.println("排好序的数组:"); for (int e : a) System.out.prin.
2021-01-05 20:53:31
80
原创 Java实现快速排序
import java.util.Arrays;/** * 快排 */public class QuickSort { public static void main(String[] args) { int[] arr = {10, 7, 2, 4, 7, 62, 3, 4, 2, 1, 8, 9, 19}; quickSort(arr, 0, arr.length - 1); System.out.println(Arrays.toSt.
2021-01-05 20:52:05
95
原创 冒泡排序-Java实现
import java.util.Arrays;/** * 冒泡排序 */public class BubbleSort { public static void main(String[] args) { int[] arr = {10, 7, 2, 4, 7, 62, 3, 4, 2, 1, 8, 9, 19}; bubbleSort(arr); System.out.println(Arrays.toString(arr)); .
2021-01-05 20:50:24
89
1
原创 职责链模式
基本概念职责链模式(Chain of Responsibility Pattern),又叫责任链模式,为请求创建了一个接收者对象的链。这种模式对请求的返送这和接收者进行解耦。 职责链模式通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,以此类推。 这种类型的设计模式属于行为型模式。原理类图说明:1)Handler:抽象的处...
2020-03-02 15:22:19
175
原创 策略模式
基本概念策略模式(Strategy Pattern)中,定义算法簇(策略组),分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户 这算法体现了几个设计原则,第一、把变化的代码从不变的代码中分离出来;第二、针对接口编程而不是具体的类(定义了策略接口);第三、多用组合/聚合,少用继承(客户通过组合方式使用策略)。原理类图说明: 从上图可以看出,客户contex...
2020-03-02 14:22:55
287
原创 状态模式
基本概念状态模式(State Pattern):它主要用来解决对象再多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换 当一个对象的内部状态改变时,允许改变其行为,这个对象看起来像是改变了其类原理类图说明:1)Context类为环境角色,用于维护State实例,这个实例定义当前状态。2)State是抽象状态角色,定义一个接口封装与Contex...
2020-03-01 22:46:16
190
原创 备忘录模式
基本概念备忘录模式(Memento Pattern)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态 可以这样理解备忘录模式:现实生活中的备忘录是用来记录某些要去做的事情,或者是记录已经达成的共同意见的事情,一方忘记了。而在软件层面,备忘录模式就有着相同的含义,备忘录对象主要用来记录一个对象的某种状态,或者某些数据,当要做...
2020-03-01 21:38:02
159
原创 中介者模式
基本概念职工接着模式(Mediator Pattern),使用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显示地互相引用,从而使其耦合松散,而且可以独立地改变它们之间的交互 中介者模式属于行为性模式,使代码易于维护 比如MVC模式,C(Controller控制器)是M(Model模型)和V(View视图)的中介者,在前后端交互时起到了中间人的作用原理类图说明:1)M...
2020-03-01 20:47:40
733
原创 观察者模式
基本原理观察者模式类似于订牛奶业务:奶站是Subject,用户是Observer Subject:登记注册、删除和通知。registerObserver注册;removeObserver移除;modifyObservers()通知所有的注册的用户,根据不同的需求,可以是更新数据,让用户来去,也可能是实时推送,看具体需求定 Observer:接收输入 观察者模式:对象之间多对一依赖的一只狗...
2020-03-01 18:30:42
133
原创 迭代器模式
基本概念迭代器模式(Iterator Pattern)是常用的设计模式。属于行为型模式 如果我们的集合元素是用不同的方式实现的,有数组,还有java的集合类,或者还有其他方式,当客户端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决。 迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:...
2020-03-01 13:33:05
162
1
原创 访问者模式
基本概念访问者模式(Visitor Pattern),封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。 主要将数据结构与数据操作分离,解决数据结构和操作耦合性问题 访问者模式的基本工作原理是:在被访问的类里面加一个对外提供接待访问者的接口 访问者模式主要应用场景是:需要对一个对象结构中的对象进行很多不同操作(这样彼此操作没有关联),同...
2020-03-01 10:44:39
225
原创 模板方法模式
基本概念模板方法模式(Template Method Pattern),又叫模板模式,在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。简单说,模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重新定义该算法的某些特定步骤。这种类型的设计模式属于行为型模式。原理类图...
2020-02-28 22:07:33
242
原创 代理模式
基本概念代理模式:为一个对象提供一个替身,以控制这个对象的访问。即通过代理对象访问目标对象。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩张目标对象的功能。 被代理的对象可以是远程对象此昂、创建开销大的对象或者需要安全控制的对象 代理模式有不同的形式,主要有三种:静态dialing、动态代理(JDK代理、接口代理)和Cglib代理(可以在内存动态的创建对象,而不需实现...
2020-02-27 20:54:01
168
原创 享元模式
基本概念享元模式也叫蝇量模式:运用共享基数有效地支持大量细粒度的对象 常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象中有我们需要的则直接拿来用,避免重新创建,如果没有我们需要的,则创建一个 享元模式能够解决重复对象的内存浪费的问题,当系统中有大量的相似对象,需要缓冲池时,不需要总是创建新对象,可以从缓冲池里拿。这样可以降低系统内存,同时提高...
2020-02-27 15:37:32
181
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人