自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 网络原理 - 11(HTTP/HTTPS - 2 - 请求)

注意的是,浏览器上运行的网页,理论上也是可以通过浏览器提供的 API 来读写本地的磁盘文件,但是浏览器禁止了这种做法(浏览器并没有给网页提供这样的 API) (不安全~~ 万一黑客通过网页,直接把我们 C 盘中的学习资料删了怎么办?当我们再收银台结账的时候,收银员会扫描我们的会员卡。上古时期,UA 是非常关键的内容,由于计算机发展迅速,不同用户使用的上网设备,差异很大,UA 就可以表明该用户上网的设备具体是什么信息,如何用户使用的是比较老的设备,返回的页面就不含新特性,确保这个页面可以正确的访问出来。

2025-04-29 20:41:19 661

原创 网络原理 - 10(HTTP/HTTPS - 1)

问:为什么 HTTP 报文中要存在“空行”??答:HTTP 协议中,并没有具体规定报头部分的键值对有多少个,空行就相当于是“报头的结束标志”,或者说空行是“报头和正文之间的分隔符”。HTTP 在传输层是依赖 TCP 协议的,TCP 是面向字节流的,如果没有这个空行,就会出现“粘包问题”~~

2025-04-28 21:05:57 785 1

原创 网络原理 - 9

DNS 服务器,并非只有一份,是有很多份的~~最开始的一套 DNS 服务器,称为”根域名服务器“,这里面的内容是非常全的~~ 各个国家的网络运营商,再根据域名服务器里面的内容,搭建出”镜像服务器“,上网的时候,一般就是就近的访问附近运营商的镜像 DNS 服务器,镜像 DNS 服务器会定期的从跟服务器中同步数据~~指的是网卡的硬件地址(也叫 MAC 地址),长度是 48 位(6 个字节的地址),是在网卡出场时候就固化了。以太网是目前使用最广泛的局域网技术,和以太网并列的还有令牌环网,无线 LAN 等~~

2025-04-26 23:37:25 938 1

原创 网络原理 - 8

大部分情况下,局域网中的不同设备,访问的是不同网站,这个时候直接通过服务器 IP 就能区分,其次情况,如果访问的是同一个服务器,就可以按照端口号来区分,再极少数情况下,碰巧访问的是同一个服务器,并且端口号相同,就可以在路由器这边自动映射成不同的端口号了,仍然能够进行区分~将 IP 地址中的主机地址全部设为 1,就成为了广播地址,用于给同一个链路中相同连接的所有主机发送数据包(广播地址)(注意,在广播地址上发消息,局域网中的所有设备都能收到,但一定要发 UDP 的消息,TCP 是不支持广播的~)

2025-04-26 20:37:06 659 1

原创 网络原理 - 7(TCP - 4)

前面的内容,就是对 TCP 协议中,一些比较重要的,需要我们了解的一些机制的介绍~~~TCP 协议也有其他重要协议,这里只是挑了几个比较核心的进行介绍~

2025-04-24 21:28:08 1730 3

原创 网络原理 - 6

=》发送方会周期性的发送一个“窗口探测包”,这个窗口探测包,并不会携带任何载荷,这样的包对于业务并不产生影响,只是为了触发接收方的 ack,一旦查询出来的结果,是非 0 的时候,就代表缓冲区又行了!发送方就可以继续发送了!重传 1001 之后,此时的确认序号就是 7001 了,而不是再从 2001 开始,确认序号要表示的是,我接下来要向发送方索要那个数据~~ 当发送方重传 1001 这个数据之后,接收方的 7000 之前的数据就都收到了,接下来就要索要 7001 这个数据了~~~

2025-04-23 21:35:49 945 2

原创 网络原理 - 5(TCP - 2 - 三次握手与四次挥手)

连接管理分为建立连接 和 断开连接~(important 重点!

2025-04-23 20:00:35 1311 1

原创 网络原理 - 4(TCP - 1)

包能顺利到达的概率是 90%,那我们重传了一次,却又发生丢包,即两次传输数据都丢包的概率是 10% * 10% = 1% ==》换个角度看,两次传输包至少有一次能到达的概率是 99%,随着重传的次数增加,包到达接收方的概率也会大大增加,如果我们连续重传了三四次仍然还是发生丢包,只能说明,此时的丢包率是非常非常非常大了,意味着此时的网络已经出现了非常非常严重的故障了!这个 ACK 是不是有些熟悉呢?数据已经被 B 收到了,再传输一次,同一份数据,B 就会收到两次,试想一下,如果发送的请求是扣款请求呢?

2025-04-22 19:52:27 1199 2

原创 网络原理 - 3(UDP 协议)

(网络传输的数据要怎么使用,当然也要考虑到数据是什么样的格式,里面包含那些内容~)协议,其实就是一种与欸的那个,虽然存在很多的现有的协议(大佬们已经搞好了的),除此之外,我们程序员也可以自己来约定协议。

2025-04-21 20:33:41 744

原创 网络编程 - 4 ( TCP )

目录TCP 流套接字编程API 介绍SeverSocketSocket用 TCP 实现一个回显服务器服务端客户端运行调试第一个问题:PrintWriter 内置的缓冲区 - flush 刷新解决第二个问题:上述代码中,需要进行 close 操作吗?第三个问题:多个客户端来访问服务器梳理代码:最终版本代码~流程图文字解释:图文解释~完!SeverSocket 是创建 TCP 服务端 Socket 的 APIServerSocket 构造方法:ServerSocket 方法:Socket 是客户端 Socket

2025-04-19 16:56:12 1127 8

原创 网络编程 - 3

因为词典服务器和回显服务器的大致逻辑都是相同的,只是在业务处理 process 方法的时候,回显服务器只是简单返回,我们要做的词典服务器只需要在 process 进行对应的业务处理即可,所以没必要再重复实现之前的逻辑~我们上一篇文章实现了一个回显服务器,在服务端中业务方法 process 中,只是单纯的将客户端输入的东西 return 了一下,我们可以在这里带一点业务逻辑~~因为 start 方法,我们的词典服务器的逻辑和回显服务器的逻辑相同,不需要进行更改,可以完全从父类进行继承。

2025-04-19 09:52:58 289 2

原创 网络编程 - 2

DatagramSocket 是 UDP Socket,用于发送和接收 UDP 数据报。

2025-04-18 19:53:26 855 5

原创 网络编程 - 1

网络编程,指网络上的主机,通过不同的进程,以编程的方式实现网络通信(网络数据传输)。也可以只需要满足进程不同即可。所以即使是同一个主机,只要是不同进程,基于网络来传输数据,也属于网络编程。特殊的,对于开发来说,在条件有限的情况下,一般也都是在一个主机中运行多个进程来完成网络编程。但,我们一定要明确,我们的目的是提供网络上的不同主机,基于网络来传输数据资源。进程 A:编程来获取网络资源进程 B:编程来提供网络资源。

2025-04-17 21:17:58 1058 1

原创 网络原理 - 初识网络 2

物理层中涉及到的都是硬件设备。数据链路层对上述数据进行解析,拿到载荷,交给网络层(IP 协议),IP 协议又会进一步的对这个数据进行解析,取出载荷,当然也要解析这里的报头(路由器需要通过 IP 报头中的目的 IP 来知道具体接下来如何转发~~)上述的过程,都是经典的交换机和路由器的大概传输过程,如果现实中的情况可能就会更加复杂,比如,交换机要截取/ 解析所传的数据,就会封装到应用层,把我们的 hello 拿出来看看~~~但是,实际上,即使是经过交换着或者路由器,上述的封装分用过程,也是同样适用的!

2025-04-16 16:34:22 729 1

原创 网络原理 - 初识网络 1

协议分层,即定义不同层次的协议:在上面栗子中,我们只有语言层和通信设备层两层,但时机的网络通信会跟该复杂,分出更多的层次。

2025-04-16 11:47:28 1236 1

原创 文件操作和 IO - 一些具体的使用栗子

查找硬盘上的文件位置,给定一个文件名,去指定的目录中进行搜索,找到文件名匹配的结果,并且打印出完整的路径。文件系统的目录结构是“树型”结构。既然是搜索,就会涉及到遍历,针对树的遍历,又要涉及递归。(这里的递归,可能比二叉树复杂一点点,目录中有几个子目录,就递归几次)这里的递归,就是进行树的遍历,把目录中,以及其中的子目录,所有的文件,都遍历一次,看是否有符合需要的。

2025-04-13 19:39:37 261 2

原创 文件操作和 IO - 3

InputStream 只是一个抽象类,要使用还需要具体的实现类。关于 InputStream 的实现类有很多,基本可以认为不同的输入设备都可以对应一个 InputStream 类,我们现在只关心从文件中读取,所以使用这是源码中 InputStream 类的声明,abstract 表示的是这是一个抽象类。有些类,我们不希望它能够创建出实例来。使用 abstract 来描述,编译器就可以进行更加严格的检查。所谓面向对象,就是通过代码抽象的表示实际事物的一种方式。

2025-04-13 18:27:38 609 1

原创 文件操作和IO - 2

属性是路径之间的分隔符,会根据系统自动进行调整。实际开发中更建议直接使用 /

2025-04-12 21:14:07 1102 5

原创 文件操作和 IO

先来认识狭义上的文件(file)。,就类似办公桌上的一份份真实的文件一样。计算机中存储数据的设备:对于计算机来说,“文件”是一个广义的概念,硬盘上的普通文件,硬盘上的目录(文件夹),很多的硬件设备,也是被操作系统抽象成了文件(键盘,显示器,网卡等等...)作为程序员,我们并不关系硬盘的内部物理结构,写代码的时候并不太涉及到这些结构细节,操作系统都帮我们封装好了。操作系统有一个专门的模块,把硬件细节封装好,提供统一的 API 来供程序员调用。

2025-04-12 16:54:23 1392 3

原创 多线程进阶

CAS:Compare and swap,字面意思:“比较并交换”,是一个特殊的 CPU 指令(严格的说,和 Java 无关)(JVM 中 关于 CAS 的 API 都是放在 unsafe 包里的,unsafe 即不安全的)一个 CAS 就会涉及到一下操作:我们假设内存中的原数据为 V,寄存器中的值是 A,需要修改的是新值 B,会有三个操作:1. 比较原数据 V 和寄存器中的值 A 是否相等 (比较)2. 如果比较相等,把 B 写入 V。(交换)3. 返回操作是否成功。

2025-04-11 18:05:38 972 13

原创 多线程代码案例(线程池)- 4

(柜员拿到我们的身份证之后,就消失在我们的视野中了,此时我们无法知道他要花费多长时间,也不知道他都要做那些事情,我们唯一能做的,就是等,等他回来 ~~)如果一个进程中,所有的线程都是 CPU 密集型的,每个线程所有的工作都是在 CPU 上执行的(假定的一种极端情况~~~)此时,线程的数目就不应该超过 N(CPU 逻辑核心数)如果一个进程中,所有的线程都是 IO 密集型的,每个线程的大部分工作都是在等待 IO,CPU 消耗非常少,此时线程的数目就可以很多很多,远远超过 N(CPU 逻辑核心数)

2025-04-08 20:24:34 1353 4

原创 多线程代码案例(定时器) - 3

定时器,是我们日常开发所常用的组件工具,类似于闹钟,设定一个时间,当时间到了之后,定时器可以自动的去执行某个逻辑。

2025-04-07 18:32:58 1012 6

原创 多线程代码案例 - 2

举个栗子:包饺子的流程:1.和面(一般都是一个人负责,没办法多线程完成)2. 擀饺子皮3. 包饺子 (第二步和第三步,这两步就可以多线程完成了)现在有 A B C 三位大兄弟,共同完成上面包饺子的步骤,擀面杖,一般一个家庭中,只有一个擀面杖,所以会发生,三个线程都去竞争这个擀面杖,A 大兄弟,拿到擀面杖擀皮了,B C 就需要阻塞等待,所以,很明显,包饺子的方式适合用多线程的方式来实现,即A 是和面的,B C 负责擀皮和包饺子。

2025-04-05 22:46:51 882 3

原创 多线程代码案例 - 1

目录单例模式1. 饿汉模式2. 懒汉模式单例模式与多线程问题1问题2问题3完!单例模式是一种设计模式。单例 ==》 即单个实例(对象),某个类,在一个进程中,只应该创建出一个实例(是原则上不应该有多个),使用单例模式,可以对我们的代码进行一个更为严格的校验和检查。实现单例模式的方式有很多种,这里介绍最基础的两种实现方式:1. 饿汉模式 2. 懒汉模式我们创建一个类,名为 Singleton 希望这个类在一个进程中,只能有唯一的实例这个引用,就是我们期望创建出的唯一的实例的引用:在这行代码中,使用 stati

2025-04-02 21:29:52 1051 7

原创 多线程 - wait notify

线程安全 --> 死锁,是在进行多线程的时候,比较常见的问题,也是比较严重的问题!!!1. 一个线程,一把锁。这个线程连续对这个锁加锁两次,如果这个锁不是可重入锁,就容易发生死锁现象。2. 两个线程,两把锁。线程 1 获取锁 A,线程 2 获取锁 B,之后,两个线程在不解开本来获取的锁的前提下,再彼此尝试获取对方的锁,就会发生死锁现象。3. N 个线程 M 把锁。哲学家就餐问题中是 N 个线程 N 把锁,如果是 N 个线程 M 把锁,场景变换一下,也会可能构造出死锁的。。

2025-04-01 19:07:57 686 4

原创 多线程 - 线程安全 3

此时 JVM 就可能会做出代码优化操作,即把上述 load 操作给优化掉(只有前几次进行 load,后续发现,反正 load 的结果都一样,静态分析代码,也没看到后续操作哪里对 fg 进行了修改,因此直接就激进的把 load 操作给干掉了),干掉 load 操作后,就相当于,不再重复读取内存了,直接使用寄存器之前”缓存“的值了,从而大幅度的提高了循环的执行速度。我们更希望的是,让我们的代码,100%不出现问题,即无论当前这个线程代码是怎么写的,不论有没有 sleep,都不要出现这种内存可见性问题。

2025-03-31 19:22:01 766 5

原创 多线程 - 线程安全 2 -- > 死锁问题

1. 【根本原因】 线程的随机调度,抢占式实行(罪魁祸首,万恶之源),多个线程执行的顺序,存在诸多变数,我们要做的就是需要保证任何一种变数下,执行结果都是正确的,无 bug 的。2. 多个线程同时修改同一个变量。3. 修改操作不是原子的。count++ 本质上是 3 个指令,load,add,save...类似的 +=,-= 也是非原子的,但是 = 这种操作,一般是原子的。4. 内存可见性5. 指令重排序。

2025-03-30 22:16:00 869

原创 多线程 - 线程安全

如下代码,让 count 在两个线程中分别自增 5000次我们预期结果应该是 100000 ,但打印的结果却和我们的预期不相同,,并且我们每次运行程序,结果都不相同,这就出现了 bug。

2025-03-30 17:36:01 1021

原创 多线程 - 线程安全引入

写一个代码,让主线程创建一个新的线程,由新的线程负责完成一系列的运算(比如:1 + 2 + 3 +... + 1000),再由主线程负责获取到最终结果。但打印结果为 result = 0,略微思考,明白了要让 t 线程先执行完,然后再打印 result。补充,其实如果主线程直接就打印 result,此时得到的结果是啥,其实是无法预期的,由于线程之间的执行顺序不确定,主线程打印的 result 可能是还没有开始计算的初始值0,也可能是过程时候的中间结果,也可能是 t 线程计算完成之后的最终结果。

2025-03-29 17:19:08 519 1

原创 多线程 -- Thread类

报错信息告诉我们,捕获的变量,

2025-03-29 16:18:42 961 3

原创 多线程 --- 多线程编程

与此同时,这个新的类,

2025-03-27 19:00:04 1060

原创 多线程 --- 进程和线程的基本知识

前面我们提到了一个概念是,多任务操作系统,即希望该系统能够同时运行多个程序。本质上说,进程,就算用来解决”并发编程“这样的问题的。在一些特定的情况下,进程的表现,其实并不能很好的解决”并发编程“,比如,,此时再使用多进程编程,就会造成较大的。早期编写服务器程序的时候,是使用C语言来进行编写的(基于一种CGI技术,该技术是一种基于多进程的编程模式)。服务器同一时刻就会收到很多请求,针对每个请求,都会创造出一个进程,给这个请求提供一定的服务,返回对应的相应。一旦这个请求处理完之后,这个进程就要被销毁了。

2025-03-24 21:26:14 966 2

原创 计算机是如何工作的

CPU,是计算机系统的核心部件,负责执行计算机的基本算数,逻辑,控制和输入输出操作指令。是计算机的运算和控制核心,是信息处理,程序运行的最终执行单元。CPU的制作工艺非常精密,现今较为出名的公司:(1)英特尔(2)AMD(3)高通。

2025-03-23 18:35:08 775 2

原创 java_Lambda表达式

Lambda表达式的优点很明显,在代码层次上来说,使得代码变的非常整洁。缺点也很明显,代码易读性差。1.代码简洁,开发迅速2.方便函数式编程3.非常容易进行并行计算1.代码可读性变差2.在非并行计算中,很多计算未必有传统的for性能高3..不容易进行调试。

2025-03-10 08:45:10 815 5

原创 java_枚举的使用

1.枚举本身就算一个类,其构造方法默认就算私有的,且都是默认继承于java.lang.Enum2.枚举可以避免反射和序列化的问题。

2025-03-09 18:42:45 1321 4

原创 java_了解反射机制

Java的反射(reflection) 机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到对应的属性和方法,就可以对部分类型信息进行修改。这种动态获取信息以及动态调用对象的方法的功能称为Java语言的反射(reflection)机制。

2025-03-09 17:28:02 1042 1

原创 java数据结构_泛型补充

用于在泛型的使用,称为通配符。

2025-03-06 19:55:26 494 3

原创 java数据结构_再谈String_10

"池" 是编程中的一种常见的, 重要的提升效率的方式, 我们会在未来的学习中遇到各种 "内存池", "线程池", "数 据库连接池" .... 比如:家里给大家打生活费的方式 1. 家里经济拮据,每月定时打生活费,有时可能会晚,最差情况下可能需要向家里张口要,速度慢 2. 家里有矿,一次性打一年的生活费放到银行卡中,自己随用随取,速度非常快 方式2,就是池化技术的一种示例,钱放在卡上,随用随取,效率非常高。执行String s2 = "abc"的时候,过程如下,将 a b c放入常量池中。

2025-03-05 20:47:51 1313 4

原创 java数据结构_Map和Set_HashMap 底层源码解读_9.5

resize方法较为复杂,先理解为扩容即可,如果未传入数组长度,则在resize方法中默认初始化长度为16。

2025-03-05 18:36:52 398 1

原创 java数据结构_Map和Set_面试题_9.4

但还是没办法,再研究,为什么会解答错误,预期结果是先输出 i ,再输出 love,我们的输出为先输出了love,后输出了 i,不对呀,我们明明记得在调整优先级队列的时候,考虑到了两个单词出现次数情况相同,然后让字母顺序小的单词入列,为什么此处出现了问题呢?蓦然回首,bug却在灯火阑珊处。我们在遍历map向优先级队列填入元素的时候,在minHeap.size() < k的时候,即建立前k个元素的小根堆的时候,频率相同的情况,并没有处理,我们只是在后面放满元素的时候,才处理了频率相同的情况。

2025-03-04 21:36:38 793 3

空空如也

空空如也

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

TA关注的人

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