- 博客(64)
- 资源 (2)
- 收藏
- 关注
原创 Spring容器之AnnotationConfigApplicationContext
AnnotationConfigApplicationContext源码分析
2022-07-24 10:26:21
675
原创 排序算法笔记-1
插入排序算法的时间复杂度是归并排序算法、堆排序算法和快速排序算法的时间复杂度是快速排序算法时间复杂度最坏的情况下是。对于归并排序算法而言,如果实现方式是自顶向下,那么算法的空间复杂度是。如果实现方式是自底向下,那么算法的空间复杂度是。归并排序算法是基于分治算法来实现的。...
2022-01-11 09:49:11
290
原创 CFA——The Time Value of Money
The Time Value of Money——货币的时间价值required rates of return——要求的回报率discount rates——折扣率the stated annual interest rate——规定年利率the frequency of compounding——复利频率
2021-12-19 22:29:12
873
原创 利用位运算判断字符是否存在
背景一般情况下,我们判断一个字符串中是否存在某个字符,最常用的方法就是遍历字符串进行逐个匹配的方法。另外,就是利用Map、Set和二叉搜索树这种结构,降低算法的复杂度。逐个遍历的方法,很明显算法复杂度是线性增长的。利用Map、Set和二叉搜索树来进行辅助的判断,这种数据结构虽然查找效率相对较高,但是本身会占用较大的存储空间。在不区分大小写的情况下,我们可以利用位运算来辅助进行判断。主要思想利用位运算来辅助判断字符是否存在于某个字符串中,主要是的思路是:在不区分大小写的情况下进行查
2021-06-19 22:48:35
1444
3
原创 斜着遍历二维数组
背景在算法实现中,经常需要斜着对二维数组进行遍历,最常见的例子,就是在动态规划算法,需要遍历二维数组的时候。这种写法,如果不熟悉,经常会导致算法实现卡壳。这里,以笔记的方式记录一下常见的实现方式,便于以后复习用。实现本文以java代码的方式实现,其他的语言可以借鉴public class Solution{ public void dp(int n){ int[][] array = new int[n + 1][n + 1]; ...
2021-06-19 09:53:12
933
原创 CyclicBarrier源码解析
CyclicBarrier源码解析CyclicBarrier,它也是一个同步助手工具,它允许多个线程在执行完相应的操作之后彼此等待共同到达一个屏障点。CyclicBarrier在涉及固定大小的线程数目的程序中非常有用,这些线程偶尔需要彼此相互等待。这个屏障之所以称为是循环的,是因为在所有等待线程释放了以后,它还可以重复使用。CyclicBarrier还支持一个可选的命令Runnable,该命令会在每个屏障点处执行一次,执行时间是在最后一个线程到达之后,但是任何线程释放之前。CyclicBarrier的这
2021-01-10 21:07:08
117
原创 CountDownLatch源码解析
CountDownLatch源码解析countDownLatch是一个用来实现同步的工具,允许一个或者多个线程等待其他的线程完成一系列的操作。类定义public class CountDownLatch{}属性定义private final Sync sync;Sync是一个内部类,一个同步器。内部类Sync的定义private static final class Sync extends AbstractQueuedSynchronizer{ private static f
2021-01-08 22:56:55
132
原创 Unsafe源码解析
Unsafe源码解析Unsafe类为执行底层的、不安全的操作提供了一个方法的集合。虽然,这个类的方法都是public的,但是只有受信任的代码才可以获得这个类的实例。该类主要使用了单例模式来实现代码,下面我们来看一下主要的源代码。Unsafe类定义public final class Unsafe{}Unsafe类的静态属性private static final Unsafe theUnsafe = new Unsafe();private static final int INVALI
2020-12-24 22:59:24
311
原创 AtomicReferenceFieldUpdater源码解析
AtomicReferenceFieldUpdater源码解析AtomicReferenceFieldUpdater原子性地更新对象的引用类型属性。外部抽象类外部抽象类的类定义public abstract class AtomicReferenceFieldUpdater<T, V>{}外部抽象类的构造方法protected AtomicReferenceFieldUpdater(){}外部抽象类的工厂方法@CallerSensitivepublic static <
2020-12-22 23:23:27
205
原创 AtomicLongFieldUpdater源码解析
AtomicLongFieldUpdater源码解析这是一个基于反射的工具类,可以对指定的类的指定long类型的被volatile关键字修饰的字段进行原子性的更新。这个类设计用于在原子数据结构中,对同一个节点的几个字段独立的进行原子性更新。外部抽象类外部抽象类的定义public abstract class AtomicLongFieldUpdater<T> {}首先,这个是一个抽象类,并且是一个泛型类,类型T就代表包含需要更新字段的类型。外部抽象类的创建更新器的方法@Calle
2020-12-20 21:22:02
210
原创 AtomicIntegerFieldUpdater源码详解
AtomicIntegerFieldUpdater源码详解一般情况下,要想使得共享数据的操作具备原子性,目前有两种方案。第一,使用关键字synchronized进行加锁;第二,将对应的共享数据定义成原子类型,比如将Int定义成AtomicInteger,其他数据类型则没有与之对应的原子类型,我们可以借助于AtomicReference进行封装。第一种方法,提供了互斥的机制来保证在同一时刻只能有一个线程对共享数据进行操作,因而这是一种悲观的同步方式。第二种方法,利用CAS算法提供的Lock Free
2020-12-17 20:43:17
292
原创 AtomicReferenceArray源码详解
AtomicReferenceArray源码解析AtomicReferenceArray主要提供了原子性操作对象引用数组元素的操作。类定义public class AtomicRefercenArray<E> implements java.io.Serializable{}属性定义private static final long serialVersionUID = -6209656149925076980L;private static final Unsafe unsafe
2020-12-09 20:42:18
191
原创 AtomicLongArray源码详解
AtomicLongArray源码详解AtomicLongArray提了原子性操作Long数据类型数组元组的操作。AtomicLongArray与AtomicIntegerArray源码类似,唯一的区别就是数组元素的类型不同。这里,不再做详细的赘述,简单记录下阅读过程。类定义public class AtomicLongArray implements java.io.Serializable{}属性定义private static final long serialVersionUID =
2020-12-06 10:50:00
132
原创 AtomicIntegerArray源码详解
AtomicIntegerArray源码详解AtomicIntegerArray主要提供原子性操作int数据类型数组元素的操作。类定义public class AtomicIntegerArray implements java.io.Serializable{}属性定义private static final long serialVersionUID = 2862133569453604235L;private static final Unsafe unsafe = Unsafe.get
2020-12-05 22:55:07
172
原创 AtomicStampedReference源码详解
AtomicStampedReference源码详解通过前面几个原子类源码的学习,可以发现这些原子类型实现原子类型的操作,主要是利用volatile和CAS来实现的。其中,volatile关键字可以保证线程可见性,而CAS算法,主要是通过unsafe,利用CPU的指令来实现操作的原子性,CAS算法实现了一种快速失败的方式,当某个线程修改已经被改变的数据时,会快速失败。另外,当CAS算法修改某个数据失败时,由于有自旋算法的加持,对于数据的修改最终会成功。在大多数情况下,通过CAS算法来实现操作的原子性,是没
2020-12-03 22:56:41
282
原创 AtomicReference源码详解
AtomicReference源码详解AtomicReference类提供了对象引用的非阻塞原子性读写操作。类定义public class AtomicReference<V> implements java.io.Serializable{}通过类定义,我们可以知道,AtomicReference是一个原子类型.属性private static final long serialVersionUID = -1848883965231344442L;private static
2020-11-27 21:31:18
644
原创 AtomicLong源码详解
AtomicLong源码详解AtomicLong提供了一种原子性操作long类型数据的解决方案。类定义public class AtomicLong extends Number implements java.io.Serializable{}AtomicLong同样也是继承自Number类,实现了序列化的接口.属性定义private static final long serialVersionUID = 1927816293512124184L;private static final
2020-11-27 20:46:36
149
原创 AtomicBoolean源码详解
AtomicBoolean详解AtomicBoolean提供了一种原子性地读写布尔类型变量的解决方案,通常情况下,该类将被用于原子性地更新状态标识位,比如flag。类定义public class AtomicBoolean implements java.io.Serializable{}AtomicBoolean的类定义很简单,实现了一个序列化的接口。属性定义private static final long serialVersionUID = 4654671469794556979L;
2020-11-25 21:02:43
241
原创 AtomicInteger源码详解
AtomicInteger类主要是为整型数据提供原子操作。类定义public class AtomicInteger extends Number implements java.io.Serializable {}首先,AtomicInteger和Integer一样都继承了Number类,其次,实现了序列化的接口。属性private static final Unsafe unsafe = Unsafe.getUnsafe();private static final long valueO
2020-11-23 20:24:36
299
原创 cmpxchg指令
CMPXCHG—比较并交换操作码指令说明0F B0/rCMPXCHG r/m8, r8比较AL与r/m8。如果相等,则设置ZF,并将r8加载到r/m8,否则清除ZF,并将r/m8加载到AL。0F B1/rCMPXCHG r/m16, r16比较AX与r/m16。如果相等,则设置ZF,并将r16加载到r/m16,否则清除ZF,并将r/m16加载到AL。0F B2/rCMPXCHG r/m32, r32比较EAX与r/m32。如果相等,则设置ZF,并将r32加载到
2020-11-10 21:11:58
1839
原创 跳转(jmp)指令
跳转指令正常执行的情况下,指令按照它们出现的顺序一条一条地执行。跳转(jmp)指令会导致执行切换到程序中一个全新的位置。在汇编代码中,这些跳转的目的地通常用一个标号(label)指明。考虑下面的汇编代码序列:movq $0, %raxjmp .L1movq (%rax), %rdx.L1: popq %rdx指令jmp .L1会导致程序跳过movq指令,而从popq指令开始继续执行。在产生目标代码文件时,汇编器会确定所有带标号指令的地址,并将跳转目标(目的指令的地址)编码为跳转指令的一部
2020-11-08 12:49:02
8551
原创 比较和测试指令
比较和测试指令1.条件码除了常用的整数寄存器,CPU还维护着一组单个位的条件码寄存器,他们描述了最近的算术或逻辑操作的属性。这个寄存器在X86CPU内部的名称叫做EFLAGS,在x86-64CPU内部扩展成RFLAGS。最常用的条件码标志有:CF:进位标志。最近的操作使最高位产生了进位。可用来检查无符号操作的溢出。ZF:零标志。最近的操作得出的结果为0.SF:符号标志。最近的操作得到的结果为负数。OF:溢出标志。最近的操作导致一个补码溢出——正溢出或负溢出。2.比较指令CMP指令根据两
2020-11-08 12:48:18
1249
原创 X86-EFLAGS寄存器
EFLAGS寄存器32位的EFLAGS寄存器由一组状态标志位、一个控制标志位和一组系统标志为组成。该寄存器内的标志位如下图所示:在处理器的初始化完成以后,EFLAGS寄存器的值是0000002H。第1、3、5、15以及22到31位均被保留着,软件不应该使用或者依赖这些位的状态值。这个寄存器中的有些标志位可以通过使用特殊目的的指令直接修改,但是并没有指令能够直接修改或检查整个寄存器。通过使用LAHF/SAHF/PUSHF/POPF/POPFD等指令,可以将EFLAGS寄存器的标志位成组移动到程序
2020-11-07 22:47:18
542
原创 GCC的内嵌汇编语法
GCC的内嵌汇编语法AT&T ASM Syntax1.Overview2.Syntax1.寄存器引用2.操作数顺序3.立即数4.符号常数5.操作数的长度6.符号扩展和零扩展指令7.跳转指令8.前缀9.内存引用3.GCC Inline ASM1.基本内联汇编1.\_\_asm\_\_2. Instruction List3.\_\_volatile\_\_2.带有C/C++表达式的内联汇编1.Output2.Input3.Operation Constraint1. 寄存器约束2. 内存约束3. 立即
2020-11-07 11:48:53
719
原创 rust中的函数
函数rust中的函数函数方法闭包捕获作为输入参数高阶函数发散函数rust中的函数函数函数的声明使用关键字fn。函数的参数需要使用类型注释,就像变量一样。如果函数有返回值,必须在->后面指出返回值的类型.在函数中的最后一个表达式语句,将被当做函数的返回值使用。我们也可以使用return语句在最后一个表达式语句之前让函数返回一个值,即使是在loop循环或者if条件语句中都是可以的。示例代码:// rust中对于函数的定义的顺序没有限制fn main(){ // 可以在此处使用函数,在后
2020-10-07 10:54:29
900
原创 rust中的控制流
rust中的控制流新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdo
2020-10-02 15:19:32
463
原创 rust中的表达式
rust中的表达式表达式表达式一个rust程序是由一系列的语句组成的。在rust中有几种表达式。最常见的就是变量声明绑定表达式和以分号结尾的表达式。语句块在rust中也是一种表达式,同时可以用在赋值语句中。在语句块中的最后一个表达式的值,将作为块语句的值,如果出现在赋值语句中,该值将会赋值给相应的变量。然而,如果最后一个表达式是以分号结尾的,那么该块语句的值就是单元值()。示例代码:fn main(){ let x = 5u32; let y = { let x_squared =
2020-09-12 14:47:58
592
原创 rust中的类型转换
rust中的类型转换rust中的类型转换From与IntoFromIntoTryFrom与TryInto字符串的to与From转换为字符串解析一个字符串rust中的类型转换基本类型可以通过显示类型转换机制(as)来实现相互之间的转换。Rust通过使用trait来处理定制类型(enum、struct)之间的类型转换。通用的类型转换一般使用的trait为From和To。然而,对于常见的类型转换场景,有更多具体的trait。尤其是在处理关于字符串转换的场景。From与IntotraitFrom和I
2020-09-06 18:01:06
2445
原创 rust中的类型
rust中的类型类型原始类型之间的转换指定字面量的类型使用类型接口类型别名类型rust提供了几种机制来实现基本类型和用户自定义类型的转换和定义。原始类型之间的转换指定字面量的类型使用类型接口类型别名...
2020-08-30 16:14:35
535
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人