自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(64)
  • 资源 (2)
  • 收藏
  • 关注

转载 apue.3e环境配置

apue.h在ubuntu18.04的编译配置

2022-10-29 17:21:57 428 1

原创 Spring容器之AnnotationConfigApplicationContext

AnnotationConfigApplicationContext源码分析

2022-07-24 10:26:21 586

原创 Java线程的生命周期

线程生命周期

2022-07-09 12:22:22 391

原创 Java创建线程的方式

Java线程创建

2022-07-05 12:29:32 126

原创 算法题——分配礼物

算法刷题记录,深度优先算法

2022-07-05 09:55:49 1164

原创 RUST——模式的使用场景

rust中的模式匹配使用场景

2022-01-24 21:39:51 680

原创 RUST——多态的实现

rust中面向对象多态的学习笔记

2022-01-22 14:58:01 1877

原创 RUST——封装的实现

rust对象封装学习笔记

2022-01-22 11:03:49 679

原创 RUST——互斥锁的使用

rust基于共享内存的方式实现通信

2022-01-15 17:22:24 2193

原创 RUST——使用消息传递方式在线程之间传递数据

rust线程通信管道

2022-01-14 13:03:36 887

原创 RUST——线程创建

个人rust学习笔记

2022-01-14 12:20:44 1028

原创 排序算法笔记-1

插入排序算法的时间复杂度是归并排序算法、堆排序算法和快速排序算法的时间复杂度是快速排序算法时间复杂度最坏的情况下是。对于归并排序算法而言,如果实现方式是自顶向下,那么算法的空间复杂度是。如果实现方式是自底向下,那么算法的空间复杂度是。归并排序算法是基于分治算法来实现的。...

2022-01-11 09:49:11 217

原创 maven——查找版本冲突的依赖

maven命令操作

2021-12-29 09:08:44 101

原创 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 569

原创 利用位运算判断字符是否存在

背景一般情况下,我们判断一个字符串中是否存在某个字符,最常用的方法就是遍历字符串进行逐个匹配的方法。另外,就是利用Map、Set和二叉搜索树这种结构,降低算法的复杂度。逐个遍历的方法,很明显算法复杂度是线性增长的。利用Map、Set和二叉搜索树来进行辅助的判断,这种数据结构虽然查找效率相对较高,但是本身会占用较大的存储空间。在不区分大小写的情况下,我们可以利用位运算来辅助进行判断。主要思想利用位运算来辅助判断字符是否存在于某个字符串中,主要是的思路是:在不区分大小写的情况下进行查

2021-06-19 22:48:35 869 3

原创 斜着遍历二维数组

背景在算法实现中,经常需要斜着对二维数组进行遍历,最常见的例子,就是在动态规划算法,需要遍历二维数组的时候。这种写法,如果不熟悉,经常会导致算法实现卡壳。这里,以笔记的方式记录一下常见的实现方式,便于以后复习用。实现本文以java代码的方式实现,其他的语言可以借鉴public class Solution{ public void dp(int n){ int[][] array = new int[n + 1][n + 1]; ...

2021-06-19 09:53:12 780

原创 CyclicBarrier源码解析

CyclicBarrier源码解析CyclicBarrier,它也是一个同步助手工具,它允许多个线程在执行完相应的操作之后彼此等待共同到达一个屏障点。CyclicBarrier在涉及固定大小的线程数目的程序中非常有用,这些线程偶尔需要彼此相互等待。这个屏障之所以称为是循环的,是因为在所有等待线程释放了以后,它还可以重复使用。CyclicBarrier还支持一个可选的命令Runnable,该命令会在每个屏障点处执行一次,执行时间是在最后一个线程到达之后,但是任何线程释放之前。CyclicBarrier的这

2021-01-10 21:07:08 80

原创 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 97

原创 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 261

原创 AtomicReferenceFieldUpdater源码解析

AtomicReferenceFieldUpdater源码解析AtomicReferenceFieldUpdater原子性地更新对象的引用类型属性。外部抽象类外部抽象类的类定义public abstract class AtomicReferenceFieldUpdater<T, V>{}外部抽象类的构造方法protected AtomicReferenceFieldUpdater(){}外部抽象类的工厂方法@CallerSensitivepublic static &lt

2020-12-22 23:23:27 163

原创 AtomicLongFieldUpdater源码解析

AtomicLongFieldUpdater源码解析这是一个基于反射的工具类,可以对指定的类的指定long类型的被volatile关键字修饰的字段进行原子性的更新。这个类设计用于在原子数据结构中,对同一个节点的几个字段独立的进行原子性更新。外部抽象类外部抽象类的定义public abstract class AtomicLongFieldUpdater<T> {}首先,这个是一个抽象类,并且是一个泛型类,类型T就代表包含需要更新字段的类型。外部抽象类的创建更新器的方法@Calle

2020-12-20 21:22:02 172

原创 AtomicIntegerFieldUpdater源码详解

AtomicIntegerFieldUpdater源码详解一般情况下,要想使得共享数据的操作具备原子性,目前有两种方案。第一,使用关键字synchronized进行加锁;第二,将对应的共享数据定义成原子类型,比如将Int定义成AtomicInteger,其他数据类型则没有与之对应的原子类型,我们可以借助于AtomicReference进行封装。第一种方法,提供了互斥的机制来保证在同一时刻只能有一个线程对共享数据进行操作,因而这是一种悲观的同步方式。第二种方法,利用CAS算法提供的Lock Free

2020-12-17 20:43:17 244

原创 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 145

原创 AtomicLongArray源码详解

AtomicLongArray源码详解AtomicLongArray提了原子性操作Long数据类型数组元组的操作。AtomicLongArray与AtomicIntegerArray源码类似,唯一的区别就是数组元素的类型不同。这里,不再做详细的赘述,简单记录下阅读过程。类定义public class AtomicLongArray implements java.io.Serializable{}属性定义private static final long serialVersionUID =

2020-12-06 10:50:00 96

原创 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 135

原创 AtomicStampedReference源码详解

AtomicStampedReference源码详解通过前面几个原子类源码的学习,可以发现这些原子类型实现原子类型的操作,主要是利用volatile和CAS来实现的。其中,volatile关键字可以保证线程可见性,而CAS算法,主要是通过unsafe,利用CPU的指令来实现操作的原子性,CAS算法实现了一种快速失败的方式,当某个线程修改已经被改变的数据时,会快速失败。另外,当CAS算法修改某个数据失败时,由于有自旋算法的加持,对于数据的修改最终会成功。在大多数情况下,通过CAS算法来实现操作的原子性,是没

2020-12-03 22:56:41 227

原创 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 575

原创 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 116

原创 AtomicBoolean源码详解

AtomicBoolean详解AtomicBoolean提供了一种原子性地读写布尔类型变量的解决方案,通常情况下,该类将被用于原子性地更新状态标识位,比如flag。类定义public class AtomicBoolean implements java.io.Serializable{}AtomicBoolean的类定义很简单,实现了一个序列化的接口。属性定义private static final long serialVersionUID = 4654671469794556979L;

2020-11-25 21:02:43 178

原创 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 218

原创 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 1644

原创 跳转(jmp)指令

跳转指令正常执行的情况下,指令按照它们出现的顺序一条一条地执行。跳转(jmp)指令会导致执行切换到程序中一个全新的位置。在汇编代码中,这些跳转的目的地通常用一个标号(label)指明。考虑下面的汇编代码序列:movq $0, %raxjmp .L1movq (%rax), %rdx.L1: popq %rdx指令jmp .L1会导致程序跳过movq指令,而从popq指令开始继续执行。在产生目标代码文件时,汇编器会确定所有带标号指令的地址,并将跳转目标(目的指令的地址)编码为跳转指令的一部

2020-11-08 12:49:02 7816

原创 比较和测试指令

比较和测试指令1.条件码除了常用的整数寄存器,CPU还维护着一组单个位的条件码寄存器,他们描述了最近的算术或逻辑操作的属性。这个寄存器在X86CPU内部的名称叫做EFLAGS,在x86-64CPU内部扩展成RFLAGS。最常用的条件码标志有:CF:进位标志。最近的操作使最高位产生了进位。可用来检查无符号操作的溢出。ZF:零标志。最近的操作得出的结果为0.SF:符号标志。最近的操作得到的结果为负数。OF:溢出标志。最近的操作导致一个补码溢出——正溢出或负溢出。2.比较指令CMP指令根据两

2020-11-08 12:48:18 876

原创 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 430

原创 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 598

原创 rust中的函数

函数rust中的函数函数方法闭包捕获作为输入参数高阶函数发散函数rust中的函数函数函数的声明使用关键字fn。函数的参数需要使用类型注释,就像变量一样。如果函数有返回值,必须在->后面指出返回值的类型.在函数中的最后一个表达式语句,将被当做函数的返回值使用。我们也可以使用return语句在最后一个表达式语句之前让函数返回一个值,即使是在loop循环或者if条件语句中都是可以的。示例代码:// rust中对于函数的定义的顺序没有限制fn main(){ // 可以在此处使用函数,在后

2020-10-07 10:54:29 800

原创 rust中的控制流

rust中的控制流新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdo

2020-10-02 15:19:32 379

原创 rust中的表达式

rust中的表达式表达式表达式一个rust程序是由一系列的语句组成的。在rust中有几种表达式。最常见的就是变量声明绑定表达式和以分号结尾的表达式。语句块在rust中也是一种表达式,同时可以用在赋值语句中。在语句块中的最后一个表达式的值,将作为块语句的值,如果出现在赋值语句中,该值将会赋值给相应的变量。然而,如果最后一个表达式是以分号结尾的,那么该块语句的值就是单元值()。示例代码:fn main(){ let x = 5u32; let y = { let x_squared =

2020-09-12 14:47:58 530

原创 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 2210

原创 rust中的类型

rust中的类型类型原始类型之间的转换指定字面量的类型使用类型接口类型别名类型rust提供了几种机制来实现基本类型和用户自定义类型的转换和定义。原始类型之间的转换指定字面量的类型使用类型接口类型别名...

2020-08-30 16:14:35 474

针对Excel表格文件操作的编程实现

使用c++语言编程实现,用到很多新的概念和方法,将Excel表格看成数据库,然后用数据库的编程概念去实现。

2013-01-29

win32api编程源代码

很经典的win32api编程教程,中文版,翻译的很好,很经典,简单明了

2013-01-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除