自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(12)
  • 收藏
  • 关注

原创 IP协议详解

IP数据报在网络传输过程中要被路由器转发,一个路由器它并不知道全局的最佳路径,只知道一些局部信息,比如和它相邻的节点,它里面有一张路由表,这个表包含了目的网络地址、相关网络节点、对某条路径的满意程度、预期路径信息等,路由器之间通过传输多种信息来维护这个表,路由器通过分析来自所有其他路由器的最新消息来构造一个完整的网络拓扑图,这样数据报在经过路由器的时候就会按照规划好的路径来走。IP地址用来描述一台设备在网络上的地址,是一个32位的整数,为了方便,通常写成四个十进制的整数,中间用.(点)隔开。

2024-06-21 14:07:40 704

原创 TCP协议

对于(1),是数据没发出去,那么只要重发数据就好了,对于(2),发送方在没有收到确认应答后重传数据,那么接收方就会收到一模一样的数据,针对这种情况,TCP会有一个“接收缓冲区”,会保存已经收到的数据和它的序号,当再次收到一模一样的数据时,就会丢弃后面来的数据。网络通信中往往是一问一答这种模型,我们知道ack是操作系统内核立即返回的,response是写代码来返回,引入了延时应答机制后,ack会延时返回,此时计算好response,要返回时,把刚才的ack捎带上,就能两条数据合并成一条,提高了效率。

2024-06-15 20:22:48 956

原创 UDP报文结构

有很多种计算校验和的算法,其中UDP使用的是循环冗余算法(CRC),把要计算的数据的每个字节进行累加,其结果作为校验和,如果传输过程中数据出现错误,那么接收方计算出的校验和就会不一样。首先,发送方在发送数据时,通过一定的算法,根据这个数据计算出校验和,然后把数据和校验和一起发送出去,接收方接收到数据,会再去计算校验和,如果这两个校验和不同,那么说明收到的数据和原来的不一样,就是出现了错误。报头占八个字节,分别是源端口号,目的端口号,udp报文长度,UDP校验和,每个部分占两个字节。那么校验和是如何做到的?

2024-06-09 19:37:42 219

原创 网络的基本概念

网络通信是个非常复杂的过程,可能涉及到很多协议,如果是一个大的协议,由于协议过于庞大,不便于人们理解和解决问题,所以拆分成很多小的协议,小的协议太多,就需要分层管理。按照一定的标准把协议分类,并且约定不同层次之间的关系,上层协议调用下层协议,下层协议为上层协议提供支持,就实现了良好的管理。端口号是两个字节的整数(0~65535),0一般不适用,而1~1023的端口号一般是系统留作特殊用途,一些知名的端口是留给常见的服务器的,比如22端口:ssh,80:http,443:https,23:telnet等等。

2024-06-04 19:56:22 506

原创 线程池总结

我们知道new关键字会触发构造方法,从而初始化对象,构造方法要求方法名必须与类名相同,有点时候我们希望一个对象有不同的构造方法,这个时候不同的构造方法只能采用方法的重载,方法重载要求参数的类型或者个数必须不同,这就有一定的局限性。在工厂模式里,设计一个类里面有许多静态的普通方法,我们调用这些普通方法完成对象的构造,就没有什么限制了。当线程池里的任务数达到上限,再往里面添加任务时,对于不同的拒绝策略会长生不同的效果。此外,线程池的线程数目设置必须是根据实际项目测试来设定的,要结合实际代码。

2024-06-02 20:08:04 431

原创 线程安全的单例模式

但是这么写,后续每次调用getInstance都要加一遍锁,而其实线程不安全的问题只有第一次创建实例才有,后续一旦实例已经创建了,接下来针对这个实例只是读取操作,所以这么写反而让代码变得有些负担,所以我们进一步去判断加锁的条件,如果实例第一次创建,那么需要加锁,如果已经存在,则不需要加锁。针对上述两种模式,在单线程下都是安全的,但是在多线程编程下,显然懒汉模式并不安全,在这种模式下,多个线程尝试对同一个变量进行读取和修改(单纯的读取是没问题的),就会产生线程安全问题。那么如何保证懒汉模式也是线程安全的呢。

2024-05-26 23:27:52 400

原创 线程安全以及解决

那么由于线程调度的随机性,两个线程同时对一个变量进行修改,就会造成穿插,比如线程1在add时,下一步本来应该是线程1save,但是却穿插了线程2的操作,就会造成混乱,执行的排列结果有很多种,造成最后的结果也是不确定的。第一次加锁后,第二次尝试进行加锁,但此时loker已经被锁定了,只能等待锁被释放,但是最外层锁如果想被释放,要执行完代码,但是里面的代码又在阻塞等待锁,线程就会卡死,也就是死锁。2不可抢占:锁的基本特性。1互斥使用:是锁的基本特性,当一个线程持有一把锁,另一个线程也想获取锁,就要阻塞等待。

2024-05-24 23:31:39 810

原创 Thread 类的基本用法

上述代码手动设置了一个成员变量isQuit为标志位,一开始isQuit为false,while里面的循环条件成立,所以子线程会持续打印” 线程工作中“,当主线程休眠时间结束,并且把isQuit设置为true,子线程循环条件不成立,线程结束工作。上述方法需手动创建标志位,稍微麻烦了一点,并且可以看到当子线程在sleep时主线程修改isQuit,线程并不能及时响应(可以看到运行结果:在修改变量之后,子线程还是执行了一次打印)在java中,想要销毁或终止一个线程,就是让run方法尽快执行完毕。

2024-05-22 22:10:51 430 1

原创 进程与线程的区别与联系

操作系统通过为进程分配cpu资源进行调度,但是进程数可能是非常多的,即使你刚打开电脑什么都不做,已经有几十上百个进程在运行,但是cpu核心数很少,就需要让进程轮番在cpu核心上执行,如果轮番的速度非常快,那么在用户眼里这些进程就像在同时执行(并发执行)。线程是依附于进程的,一个进程可以包含多个线程,同一个进程的线程之间共用一份进程已经申请好的内存资源,所以创建线程的时候不用再额外申请资源,每个线程之间可以独立进行调度。首先要了解操作系统。线程也叫做轻量级进程,相比起来,线程的创建、销毁与调度都比进程更快。

2024-05-19 10:00:19 259 1

原创 LeetCode189(轮转数组)

输入: nums = [1,2,3,4,5,6,7], k = 3。输入:nums = [-1,-100,3,99], k = 2。向右轮转 1 步: [7,1,2,3,4,5,6]向右轮转 2 步: [6,7,1,2,3,4,5]向右轮转 3 步: [5,6,7,1,2,3,4]向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100]输出: [5,6,7,1,2,3,4]输出:[3,99,-1,-100]

2024-05-09 17:10:13 191

原创 ArrayList的三种遍历方式

首先创建一个顺序表,通过add为表中添加四个整型元素。可以还从后往前遍历,需要传入最后一个元素的位置。两种方式都可以,相当于第一个是第二个的父类。2通过for each遍历。1通过for循环遍历。

2024-05-09 14:15:16 264

原创 Java数据类型

Java数据类型分为基本数据类型和引用数据类型。

2024-04-27 12:53:04 197 1

空空如也

空空如也

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

TA关注的人

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