- 博客(65)
- 收藏
- 关注
原创 Java中的volatile关键字的作用
volatile首先只能用于类的成员变量,因为volatile的作用是保证多线程之间对变量的可见性。所以如果使用volatile关键字修饰局部变量,由于每一个线程都有自己的私有的栈空间,所以局部变量无法被其他的线程所访问。不volatile只能用于修饰类的成员变量。
2026-01-10 17:29:46
360
原创 Java模拟实现定时器
Java中的定时器是Timer,通过调用Timer对象的schedule方法传入任务和延迟时间。以上代码表示:在1秒后打印 1000.运行以上代码后发现,程序一直没有退出,说明在timer对象中创建了一个线程,这个线程正在等待我们派发任务,所以一直没有退出。
2026-01-10 17:08:28
268
原创 Java实现生产者消费者模型
一般的队列,只能放元素和存元素,并且如果put元素的时候队列为空,或者take元素的时候,队列为满。那么这put方法和take方法就会直接返回。但是在阻塞队列中如果为满或空,则会等待。阻塞队列主要是依赖锁实现的。故:在判断队列为空或者为满的时候,需要使用while进行循环等待。这样做是为了在线程被唤醒时,能够继续检查队列是否再次空或者为满。这也是官方推荐的做法:将while循环和wait方法配合使用。
2026-01-08 21:05:40
226
原创 Java多线程中的单例模式
单例模式的基本含义:一个对象在JVM中始终只存在一个。要做到看起来比较简单:只需要给类创建一个实例即可。但实际可不是看起来这么简单。这里的s1和s2指的是同一个对象。但是这个对象创建的太早了,在类加载的时候就实例化了,故这种模式也称之为饿汉模式(一个人太饿了就饥不择食就吃的很早)。
2026-01-07 17:02:48
440
原创 如何删除cisco pocket tracer中的PDU数据包
本文简要说明删除PDU设备或连接线的操作步骤:首先需要选中带有PDU的设备或连接线,随后点击界面中的删除按钮即可完成操作。文中配图展示了操作界面示意图,帮助用户直观理解删除流程。整个删除过程简单快捷,仅需两个步骤。
2025-07-07 23:00:40
488
原创 Linux进程地址空间详解
这个映射关系是通过分页表进行存储的,子进程继承父进程的时候,会继承父进程的PCB中的大部分属性,会继承进程地址空间,会继承分页表。内存申请函数申请的地址申请的是虚拟地址,申请之后并不会立刻在物理内存中开辟对应的大小的空间,而是当我们要开始使用这个地址时,OS才会在物理空间中开辟对应大小的空间并将这个虚拟地址与物理地址建立映射关系.当子进程对这个全局变量做修改时,会在物理内存中拷贝一份,只是子进程会改变自己的映射表对应的物理地址,而虚拟地址没有发生改变,但是通过不同的映射关系找到了不同的物理内存中的值。
2025-04-10 15:23:01
365
原创 Linux进程详解
进程 = 内核PCB对象 + 可执行程序在cpu内核中,让进程进行排队的本质就是让PCB进行排队,每一个PCB指向自己的可执行程序,未来所有对进程的操作,都只是与进程的PCB有关.PCB中具体有那些属性?PID可以通过ps -ajx进行查看这里为何会有第二个process程序?这是grep程序形成的程序如何在一个程序内获得自己的pid呢?使用可以在文件中查看一个进程的信息,例如 :,存储的是内存中的实时的数据这些目录的名字是根据进程的pid进行命名的通过进行查看注意这个/proc/1。
2025-04-10 15:15:46
816
原创 GDB调试器的使用大全
注意:linux中发布软件的方式一共有两种,第一种是debug,第二种是release。debug是可以被调试的,release模式是不可以被调试的。暂时修改变量的内容(不用改代码,就可以进行多分支测试)将代码直接运行到指定的第n行,如果是死循环,就会卡住。gcc/g++在编译时默认的是release模式。开始看第n行的代码,可以接着按enter往下看.如何验证这个可执行程序是debug模式?在指定源文件处的第n行打断点。删除Num为n的断点(通过。从一个断点运行到下一个断点。在函数的入口处打断点。
2025-04-10 14:52:36
226
原创 Linux编辑器
yum是包管理器,类似于Linux的应用商店,安装和卸载工具需要使用yum,Linux系统中是预装了yum的rzsz工具: Linux和window的文件互传工具查看所有的软件列表:yum listel代表centos,@base代表软件的提供方是base卸载软件拓展yum源:好玩(无用)的指令yum源在哪里查看?如何更新yum源?先备份阿里云源清华大学源网易源清理缓存和验证新源是否可用更新yum源的本质就是: 用新的保存有各种文件替换现有的文件。
2025-03-17 13:33:26
1369
原创 Linux权限
date指令控制格式date +格式date +%s显示时间戳时间戳是唯一性的,是范围查找的.cal指令:查看日历find指令使用find需要指定路径which指令which 指令名whereis指令可以查找指令的路径,也可以查询所有的文件grep指令grep默认是大小写敏感的,前面加上-i选项就可以都匹配上.grep加上-n选项还能包含前面的行号-v选项是反向匹配grep的使用案例,查看特定的进程信息grep的使用案例,查看特定等级的日志。
2025-03-17 13:19:14
729
原创 C++中的模板(上)
模板类中方法的声明与普通类中方法的声明是一样的.public:// 方法声明~Stack();int _top;// 方法定义template<class T> // 声明模板参数_top = 0;// 方法定义_top = 0;// 方法定义对于普通类而言,类中方法的声明与定义是可以在不同的文件中的.但是对于模板类,方法的声明与定义是不支持在不同文件中的.不能像普通类那样将类的声明放到头文件中,将方法的定义放在源文件中.
2025-02-05 20:58:49
589
原创 C++内存管理
malloc/free是函数,但是new/delete是操作符.malloc申请的空间不会初始化,但是new申请的空间可以初始化malloc申请空间的话,需要手动计算空间大小并传递,new只需要在其后面跟上空间的类型即可,如果是多个对象,[]中指定对象个数即可malloc的返回值为void*,在使用的时候,必须强转,new不需要,因为new后面跟的是空间的类型malloc申请空间失败时,返回的是NULL,因此使用的时候必须判空,new不需要,但是在使用的时候必须捕获异常.
2025-01-26 18:48:18
1032
原创 C++(类和对象)
/stack.h文件private:int *_a;int _top;public:// 注意:默认在类中定义的函数就是内联函数,前面自动会有一个inline.// 但是,如果函数体太长,编译器会忽略inline,将其作为普通函数处理.//正确的做法:// 长的函数声明与定义分离// 短的函数直接在类中定义即可.// stack.cpp文件// 声明与定义分离的时候,需要使用Stack::进行修饰_a = 0;_top = 0;//....
2025-01-14 17:55:52
870
原创 C++中二叉搜索树的模拟实现(二叉搜索树是map,set的底层原理)
二叉树和别的树的区别就是各个节点的排列有了区别,节点中存储的内容还是不会变的,仍然是左右指针,和一个值.K _key;
2024-04-04 15:00:00
961
原创 C++(set和map详解,包含常用函数的分析)
定义两个迭代器,分别指向各自的set集合,迭代器从头开始遍历,并且比较两个迭代器指向的数据的大小,其中,小的数据,就是差集,接着让小的迭代器++,假如比较的数据相同,那么该值就是两个set的并集,此时两个迭代器都向后++,直到有一个迭代器走到了end位置.此时就找到了两个set的差集和交集.multiset和set的用法类似.但是multiset只能排序,不能去重.multiset的底层遇见相同的值的节点的时候,会插入在已有的值的节点的左边或者是右边均可.最后经过旋转了之后结果都是一样的.
2024-04-03 23:00:00
1157
原创 linux基本指令(Chapter 2)
date命令的是显示时间:使用date +%Y:%m:%d可以指定格式显示时间.例如:()并且date +%s。
2023-10-24 20:31:27
435
3
原创 C++(Chapter 3)
注意:如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它.C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。auto可以自动识别变量的类型int main()int a = 10;
2023-10-24 20:04:01
559
原创 Linux基本指令(Chapter 1)
在安装好的虚拟机里输入ifconfig指令之后,会出现如下界面,这里的inet之后的部分就是虚拟机的ip,在xshll中连接虚拟机需要虚拟机的ip地址.在xshell中连接虚拟机.点击新建接着接着填写虚拟机的用户名:接着就是填写虚拟机的该用户的登录密码即可最后在xshell中显示如下内容就代表显示成功了。
2023-10-14 23:25:52
345
3
原创 C++ (Chapter 2)
在C++中,在函数定义的时候,可以为形参指定一个默认值,也称作缺省值.如果在调用这个函数时没有传参,那么函数在执行的时候就采用该实参的缺省值,否则使用实参的值.运行结果:此处在调用时值传递了一个参数,这个参数会赋值给第一个形参,第二个形参没有赋值,就会使用默认的10进行运算.
2023-10-13 11:04:07
395
4
原创 C++ (Chapter 1)
先来看一个C语言的例子:下面这段代码是可以正常运行的.但是,包含了一个头文件之后,甚至无法通过编译.根据报错信息来看,rand本来是库中的一个库函数,但是这里我们也创建了一个叫做rand的变量,所以这里在执行语句时,就无法辨别rand到底是哪个了.假若有人在项目中恰好就将某个变量名或者函数名设置成了与库中一样的名字,可就惨了,因为C语言本身是没有办法自己去解决这个问题的,只能我们主动避免.命名空间的定义:所以为了解决上述出现的情况,C++中出现了命名空间.我们可以主动将我们声明的变量和函数等都写入这个命
2023-10-11 21:25:15
469
3
原创 数据结构--队列与循环队列的实现
每个节点需要存储数据和下一个节点的地址.typedef struct QueueNode//此处定义的是每个节点的结构}QueueNode;由于我们是对每个节点之间的链接关系进行处理,所以就需要定义结构体的指针对节点中的next指针进行操作,所以我们可以定义head和tail两个结构体指针,head指针指向链表的第一个节点,tail指针指向链表的最后一个节点.那么就可以将这两个节点也包装成一个结构体typedef struct Queue//将两个指针包装成一个结构体}Queue;
2023-10-04 09:55:48
548
原创 数据结构--栈的实现
栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。:栈其实可以看作一个弹夹,数据就是一个一个的子弹,而子弹在弹夹中确是先进去的要后被发射,最后后进去的反而会先被发射。**进栈就是装子弹的过程,而出栈就是发射子弹的过程。**同时,下图是向栈中插入数据(Top),只能从栈顶插入数据。下图是取出栈中的数据(Pop),只能从栈顶取出数据。
2023-09-30 23:00:00
653
2
原创 每日一题(两数相加)
由于链表从头开始向后存储的是低权值位的数据,所以只需要两个指针p1和p2,分别从链表的头节点开始遍历。并在这个构造的新链表的相应的节点中存储p1和p2对应值的相加结果。但是p1和p2所对应的节点的值相加可能会产生进位,所以创建一个pre变量用于存储相应的进位值。,所以在将两个链表遍历结束之后,需要对pre的值进行判断,假若pre的值是0,则直接返回newhead即可,pre的值若是1,则还需要创建一个节点。,(因为这俩个链表的相同长度的部分的链表的最后一个节点中存储的值也会存在相加产生进位的情况)。
2023-09-09 22:22:48
581
3
原创 每日一题(设计循环队列)
假若我们开辟的是5的单位的空间,那么当存满了k个数据之后,此时的rear和front就都指向了数组中的第一个元素。那么请仔细想想,在初始化的时候我们也将rear和front也初始化为了0,也指向了数组中的第一个元素。那么在这两种情况下,front和rear都指向了数组的第一个元素,但是队列中的元素个数却是大不相同,无法将队列为满和队列为空进行分开。,存储成功之后rear自加1,也就是意味着rear始终指向的当前队尾元素的下一个位置。本题只能为队列开辟k个单位空间,并且只能利用这几个空间进行数据的存储。
2023-09-08 19:47:30
359
6
原创 每日一题(复制带随机指针的链表)
如下图所示(红色的是random指针,绿色的是next指针):新节点之间的random的链接关系和原链表的random的链接关系并没有改变。在两个指针向后更新的过程中,肯定是cur1->next先为NULL,当cur1->next为NULL时就退出循环,但是此时的cur2的next指针仍然指向的是新开辟的最后一个节点。但是实际上操作起来更复杂。创建三个指针cur1和cur2和newhead,cur1从head的next处开始遍历,cur2从head处开始遍历,newhead指针用于记录cur1的起始位置。
2023-09-02 00:23:26
312
3
原创 每日一题(链表中倒数第k个节点)
如下图所示:此题仍然定义两个指针,fast指针和slow指针,假设链表的长度是5,k是3,那么倒数第3个节点就是值为3的节点。那么我们可以先让fast指针向后走k次,也就是3次。slow指针仍然指向头节点。
2023-09-01 23:08:12
772
2
原创 每日一题(链表的中间节点)
如下图:可以定义两个结构体指针均从链表的头节点开始向后遍历,fast指针一次走两步,slow指针一次走一步,fast指针的速度永远是slow指针速度的两倍。:当链表的个数为奇数个时(如下图),直到fast走到尾节点时,此时slow节点就是链表的中间节点。:当链表的个数为偶数个时(如下图),直到fast为空指针时,此时的slow节点就是链表的中间节点。
2023-09-01 00:15:18
202
原创 每日一题(反转链表)
可以定义一个新的newhead结构体指针。再定义cur指针和next指针互相配合,将原链表中的节点从头到尾依次头插到newhead链表中,同时更新newhead。最后返回newhead即可。
2023-08-30 23:58:32
259
原创 每日一题(移除链表元素)
203. 移除链表元素 - 力扣(LeetCode)思路一:思路二:思路一代码:思路二代码:注意:以下都是针对思路一的讲解:图解:本题的全部分析就到这里啦,若有不足,欢迎评论区指正,下期见!
2023-08-30 22:41:23
271
1
原创 动态内存管理详解
目前来回顾一下想要在内存中开辟空间有哪些方法?但是这两种开辟方式都有两个特点:用于开辟内存的函数:这个函数能申请一块连续的指定大小为 字节大小的内存,同时返回指向该内存的指针。用于释放内存的函数:free函数用于释放在堆上开辟的内存。malloc和free函数的声明都在 头文件中。接下来看几个例子:这里的代码是会报错的,因为数组的创建方括号里的值必须是常量。要特别注意。再看一个例子:这里在释放了动态开辟的空间之后,是否要将指向该内存的指针变量置为空呢?这里一定是要置为空的,可以有效防止后面对该指针进
2023-08-21 14:00:00
202
原创 动态内存开辟
这里在Test函数中,只是将str指针本身传过去了,在Getmemory函数中,对形参p进行修改并不会影响到Test函数中str变量的值。出了Germemory函数str的值还是NULL,此时srtcpy函数对str这个空指针进行操作就是不合法的操作,导致程序错误。
2023-08-21 13:03:57
162
原创 通讯录(静态版)
int age;}PeoInfo;注意:这里数组内的常量最好是定义成宏,这样后续修改起来就很方便了。这里typedef类型重命名一下比较方便。这里就假设最多只能存下100个联系人。但是这样定义是否有一些缺陷呢?那就是假设我们存储了100个人,还想接着存储联系人,但是由于此时并没有变量来记录通讯录中的联系人的个数,就会产生容量不足的问题。所以,需要一个变量来记录存储的联系人的个数。那我们不妨将这两部分放到结构体里:定义一个通讯录结构体。int sz;}Contact;
2023-08-11 19:09:51
363
原创 自定义类型——枚举
枚举顾名思义就是一一列举。将可能的取值一一列举。像在这些场景中就可以使用枚举了。:(需要用到enum关键字)以上定义的enum Dayenum Sexenum Color都是枚举类型。{}中的内容是枚举的可能取值。也叫做枚举常量。注意:枚举类型里的可能取值都是常量。一旦枚举声明之后其成员的值是不能被修改的。
2023-08-09 14:00:35
285
1
原创 自定义类型——联合
联合也是一种特殊的自定义类型。发现联合每个成员的起始地址都是相同的,说明他们都是从同一个地址处开始增长的,包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。:(需要union关键字)
2023-08-09 10:06:12
199
原创 自定义类型——结构体
结构体变量的定义:结构体变量的定义有两种方式:第一种:声明结构体的时候在变量列表定义结构体变量int x;int y;} p1;//声明类型的同时定义变量p1int x;int y;//定义结构体变量p2结构体变量的初始化:根据两种不同的定义方式,初始化方式也分为两种:int age;结构体的嵌套初始化:(在结构体中包含其他的结构体类型)int x;int y;int data;
2023-08-07 23:44:45
226
原创 C语言内存函数详解
memcpy函数函数功能:从source指向的内存空间处拷贝num个字节的内容到destination指向的内存中,当拷贝的内容是'\0'时,函数不会主动停下来,除非拷贝的内容达到了num个字节。使用案例:将arr2数组拷贝进arr1数组。0 };i < 10;10 };i < 10;注意。
2023-08-04 13:45:59
426
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅