自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Cookie 和 Session

HTTP 协议属于 "无状态" 协议:默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系. 但是大多数时候, 我们是需要知道请求之间的关联关系的。例如登陆网站成功后, 第二次访问的时候服务器就能知道该请求之前是不是登陆过了。图中的 "令牌" (sessionid)通常就存储在 Cookie 字段中(相当于给了一张超市会员卡)。此时在服务器这边就需要记录令牌信息, 以及令牌对应的用户信息, 这个就是 Session 机制所做的工作.

2024-05-22 20:18:15 633

原创 Servlet 的 API

init:当 tomcat 收到了 /hello 这样的路径是请求后就会调用 HelloServlet,于是就需要对 HelloServlet 进行实例化(只实例一次,后续再有请求也不实例了)。destory:如果是通过 smart tomcat 的停止按钮,这个操作本质上是通过 tomcat 的 8005 端口主动停止,能够触发 destory。但如果是直接杀进程,此时很可能来不及执行 destory(这种情况比较常见)。

2024-05-22 19:28:24 624

原创 Servlet 是什么及创建第一个 Servlet 程序

网站的后端就涉及到 http 服务器,因此肯定需要针对 http 协议进行一系列操作。tomcat 已经把这些相关操作已经封装好了,就叫 Servlet。Servlet 是一种实现动态页面的技术是一组Tomcat提供给程序猿的API,帮助程序猿简单高效的开发一个 web app.静态页面:内容始终固定的页面即使页面内容也不会发生变化.(tomcat 官网每个人的页面都是一样的)页面内容会发生变化.(B站每个人的页面都是不一样的)使用IDEA创建一个Maven项目。

2024-05-18 16:49:45 730

原创 Tomcat

下载安装这里所说的 Tomcat 并不是动画片里的而是一个学习了 HTTP协议知道了HTTP协议就是HTTP客户端和HTTP服务器之间的交互数据的格。同时也通过 ajax和分别构造了HTTP客户端. HTTP 服务器我们也同样可以通过来实现而Tomcat就是基于Java实现的一个开源免费, 也是被广泛使用的 HTTP服务器。下载安装。

2024-05-18 13:57:40 217

原创 应用层之 HTTP 协议

HTTP (全称为 "超文本传输协议") 是一种应用非常广泛的 应用层协议。所谓 "超文本" 的含义, 就是传输的内容不仅仅是文本(比如 html, css 这个就是文本), 还可以是一些 其他的资源, 比如图片, 视频, 音频等二进制的数据。浏览器获取到网页,就是基于 HTTP 的,也就相当于 浏览器 和 服务器 之间的桥梁。目前我们主要使用的还是 HTTP1.1。

2024-05-15 16:12:33 734

原创 DOM API

要能够和用户交互,就得先知道用户干了啥,用户做的一些动作,会在浏览器中产生一些事件(鼠标点击、按下键盘、调整浏览器窗口等),然后代码就需要针对这些事件作出反应。就像一放学回家,老妈(事件源)就一脸严肃坐在沙发上盯着我(事件类型),我这时就紧张地回忆我犯了什么事,是考试不及格还是偷偷吃辣条(事件处理程序)。使用 innerHTML 属性就能拿到元素里面的内容(开始标签 和 结束标签 夹着的内容),修改这个属性,就会影响到界面的显示。如果需要与指定选择器匹配的所有元素的列表,则应该使用。

2024-05-13 14:53:32 982

原创 应用层协议之 DNS 协议

就是一个域名解析系统。域名就是网址,类似于 www.baidu.com。网络上的服务器想要访问它,就得需要它对应的 IP 地址,同时,每个域名对对应着一个 / N个 IP 地址(即对应多台服务器)。因此,为了能够把域名和 IP 地址给对应上,就有了以下两种方法。

2024-05-09 17:19:19 328

原创 数据链路层之 以太网协议

这个协议即规定了数据链路层,同时也规定了物理层的内容。平时使用到的网线,其实也叫做“以太网线”(遵守以太网协议的网线)。

2024-05-09 16:28:40 376

原创 网络层协议之 IP 协议

一个数据报构造出来会有一个初始的 TTL 数值(比如 32、64),这个报每经过一个路由器转发,TTL-1,如果一直减到 0,还没有到达目标,那么就会认为这个报永远不会到达了,就会丢弃。8 位服务类型:实际上只有 4 位是有效的,这四位中只能出现 1 位是 1,其余的都是 0,因此就表示 IP 协议的四种形态 / 四种工作模式:最小延时、最大吞吐量、最高可靠性、最小成本。4 位首部长度:描述了 IP 报头多长,IP 报头是变长的,因为报头中的选项部分是可有可无的,此处的单位也是 4 字节(

2024-05-08 20:39:03 1139

原创 传输层之 TCP 协议

源/目的端口号:表示数据是从哪个进程来,到哪个进程去。序号:发送数据的序号。确认序号:应答报文的序号,用来回复发送方的。4 位首部长度:一个 TCP 报头,长度是可变的,不像 UDP 固定是 8 个字节。描述了 TCP 报头具体多长。因为选项之前的部分都是确定的 20 字节,所以首部长度 -20 字节就是选项部分的长度。如果首部长度值是 5,表示整个 TCP 报头是20字节(相当于没有选项)。

2024-05-03 20:28:08 910

原创 传输层之 UDP 协议

发送方会发数据和校验和过去,接收方会针对收到的数据生成一个校验和跟收到的校验和进行比较,一样的话就是正确的,不一样就会直接丢弃。因为 UDP 报文长度是 2 个字节表示,即 16 位,表示的范围是 -32768 → +32767,即 0 → 65535,换算单位就是 64 KB。UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一 致;UDP 会把载荷数据,就是通过 UDP Socket,即 send 方法拿来的数据基础上,在前面拼接上 8 个字节的报头。

2024-05-03 09:39:59 1121

原创 TCP流套接字编程

ServerSocket 是专门给服务器使用的 Socket 对象。

2024-04-27 16:42:58 1108

原创 UDP数据报套接字编程

DatagramSocket,是UDP Socket,用于发送和收 UDP 数据报。使用这个类,表示一个 socket 对象。一个 socket 对象只能跟一台主机进行通信。在操作系统中,把这个 socket 对象当成一个文件来处理的,相当于是 文件描述符表 上的一项。创建一个UDP数据报套接字的Socket,随机分配一个空闲端口(一般用于客户端)创建一个UDP数据报套接字的Socket,绑定到本机指定的端口(一般用于服务端)从此套接字接收数据报(如果没有接收到数据报,该方法会阻塞等待)

2024-04-25 20:33:26 543

原创 关于死锁的详谈

死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。光头强和女神一起去饺子馆吃饺子. 吃饺子需要酱油和醋,光头强抄起了酱油瓶, 女神抄起了醋瓶.光头强: 你先把醋瓶给我, 我用完了就把酱油瓶给你.光头强: 你先把酱油瓶给我, 我用完了就把醋瓶给你.如果这俩人彼此之间互不相让, 就构成了死锁.酱油和醋相当于是两把锁, 这两个人就是两个线程.为了进一步阐述死锁的形成, 很多资料上也会谈论到 "哲学家就餐问题".

2024-04-20 11:15:01 860

原创 JUC(java.util.concurrent) 的常见类

Callable 是一个 interface(类似之前的 Runnable,用来描述一个任务,但是没有返回值)也是描述一个任务的,有返回值。方便程序猿借助多线程的方式计算结果.创建线程计算 1 + 2 + 3 + ... + 1000, 不使用 Callable。

2024-04-20 10:29:21 1364

原创 八股文之 synchronized 原理

偏向锁不是真的 "加锁", 只是给对象头中做一个 "偏向锁的标记", 记录这个锁属于哪个线程. 如果后续没有其他线程来竞争该锁, 那么就不用进行其他同步操作了(避免了加锁解锁的开销) 如果后续有其他线程来竞争该锁(刚才已经在锁对象中记录了当前锁属于哪个线程了, 很容易识别当前申请锁的线程是不是之前记录的线程), 那就取消原来的偏向锁状态, 升级成轻量级锁状态. 偏向锁本质上相当于 "延迟加锁" . 能不加锁就不加锁, 尽量来避免不必要的加锁开销. 但是该做的标记还是得做的, 否则无法区分何时需要真正加锁.

2024-04-19 12:59:02 1094

原创 八股文之 CAS

CAS: 全称Compare and swap,字面意思:”比较并交换“,一个 CAS 涉及到以下操作:我们假设内存中的原数据V,旧的预期值A,需要修改的新值B。1. 比较 A 与 V 是否相等。(比较)2. 如果比较相等,将 B 写入 V。(交换)3. 返回操作是否成功。上述这个 CAS 过程并非是通过一段代码实现的,而是通过。

2024-04-18 14:30:27 1040

原创 八股文之“常见的锁策略“

接下来讲解的锁策略不仅仅是局限于 Java . 任何和 "锁" 相关的话题, 都可能会涉及到以下内容. 这些特性主要是给锁的实现者来参考的.也就是说你实现锁的时候,考虑出现锁竞争了咋办。普通的程序猿也需要了解一些, 对于合理的使用锁也是有很大帮助的.预测锁竞争不是很激烈,做的工作相对少一些预测锁竞争会很激烈,做的工作相对多一些举个栗子: 同学 A 和 同学 B 想请教老师一个问题.同学 A 认为 "老师是比较忙的, 我来问问题, 老师不一定有空解答". 因此同学 A 会先给老师发消息: "老师你忙嘛。

2024-04-17 10:45:27 817

原创 Java的定时器

schedule 包含两个参数. 第一个参数指定即将要执行的任务代码, 第二个参数指定多长时间之后执行 (单位为毫秒)。原因:把时间小的作为优先级高的先执行,如果还没到指定的执行时间就阻塞。此时就只需看队首元素即可,时间复杂度就是O(1)。定时器是软件开发中的一个重要组件. 类似于一个 "闹钟"。达到一个设定的时间之后, 就执行某个指定好的代码.比如一个 Map, 希望里面的某个 key 在 3s 之后过期(自动删除).b)一个在定时器内部的线程(用来扫描队首元素是否可以执行)a)一个带优先级的阻塞队列。

2024-04-16 17:28:57 738

原创 关于阻塞式队列

阻塞队列是一种特殊的队列. 也遵守 "先进先出" 的原则.阻塞队列能是一种线程安全的数据结构, 并且具有以下特性:a) 当队列满的时候, 继续入队列就会阻塞, 直到有其他线程从队列中取走元素.b) 当队列空的时候, 继续出队列也会阻塞, 直到有其他线程往队列中插入元素.生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。

2024-04-14 14:17:33 524

原创 单例模式以及常见的两种实现模式

此时在 t2 的角度 instance 就非空了,就会直接返回instance 了,但由于 t1 的 2 指令还没执行完,t2 拿到的是一个非法的对象(还没构造完成的不完整的对象),这时候如果尝试使用引用中的属性就会出现错误。因为 static 修饰的变量落入到了类对象里面,又因为类对象是在类加载阶段内创建出来的唯一一个实例,同时构造方法是 private 修饰的,因此就只有这一个实例的成员了。类加载的时候不创建实例,第一次使用的时候才创建实例,如果不用就不创建了(效率更高了)

2024-04-11 16:18:00 1227

原创 wait 和 notify

P 打算去 ATM 上取点钱,但是这时候显示没钱了,这时候 P 就要出去等在外面排队的人进去查余额、存款、转账......结果在排队的人都是取钱的,这时候运钞车就来了,工作人员把钱放进去之后说:可以了。多个线程 wait 的时候,notify 是随机唤醒一个,notifyAll 是所有的线程都唤醒,然后这些线程再一起竞争锁。其实理论上 wait 和 sleep 完全是没有可比性的,因为一个是用于线程之间的通信的,一个是让线程阻塞一段时间,唯一的相同点就是都可以让线程放弃执行一段时间.

2024-04-09 15:43:15 1114

原创 volatile 关键字

在 Java 程序里,有主内存,每个线程也有自己的工作内存 ( t1 和 t2 的工作内存不是同一个东西 ) t1 线程在进行读取的时候,只是读取了工作内存中的值. t2 线程在进行修改的时候,先修改工作内存的值,然后再把工作内存的内容同步到主内存中 但是由于编译器优化,导致 t1 没有重新从主内存中同步数据到工作内存,因此读到的结果就是“修改之前”的。

2024-04-08 17:37:16 1015

原创 多线程带来的的风险-线程安全、锁的问题

值的一提的是, 快和慢都是相对的. CPU 访问寄存器速度远远快于内存, 但是内存的访问速度又远远快于硬盘.对应的, CPU 的价格最贵, 内存次之, 硬盘最便宜.这种叫做指令重排序。由于每个线程有自己的工作内存, 这些工作内存中的内容相当于同一个共享变量的 "副本". 此时修改线程1 的工作内存中的值, 线程2 的工作内存不一定会及时变化.但是是非原子的,出现线程安全问题的概率就非常高了。所谓的 "主内存" 才是真正硬件角度的 "内存". 而所谓的 "工作内存", 则是指 CPU 的寄存器和高速缓存.

2024-04-01 15:07:59 1155 1

原创 线程的状态

状态是针对当前的线程调度的情况来描述的。线程是调度的基本单位,状态更应该是线程的属性。线程的状态是一个枚举类型 Thread.State1. NEW:安排了工作, 还未开始行动(创建了 Thread 对象,但还没有调用 start (内核里还没有创建对应 PCB ))2. TERMINATED:工作完成了(表示内核中的 PCB 已经执行完毕了,但是 Thread 对象还在)3. RUNNABLE: 可工作的a)正在 CPU 上执行的b)在就绪队列里,随时可以去 CPU 执行的。

2024-03-31 10:41:15 563

原创 Thread 类使用及常用操作

例如,张三只有等李四转账成功,才决定是否存钱,这时我们需要一个方法明确等待线程的结束。因为线程的调度是不可控的,所以,这个方法只能保证实 际休眠时间是大于等于参数设置的休眠时间的。Thread 类是 JVM 用来管理线程的一个类,换句话说,每个线程都有一个唯一的 Thread 对象与之关。就是用来描述一个线程执行流的,JVM 会将这些 Thread 对象组织起来,用于线程调度,线程管理。用我们上面的例子来看,每个执行流,也需要有一个对象来描述,类似下图所示,而 Thread 类的对象。

2024-03-30 11:11:18 1017

原创 计算机网络基础知识详解

网络互连的目的是进行网络通信,也即是网络数据传输,更具体一点,是网络主机中的不同进程间,基。在代码中,类似于定义好一个接口,一方为接口的实现类(提供方,提供服务),一方为接口的使用类。地址解决了网络通信时,定位网络主机的问题,但是还存在一个问题,传输到目的主机后,由哪个进。如果属于全球化的公共型广域网,则称为互联网(又称公网,外网),属于广域网的一个子集。时序定义了何时进行通信,先讲什么,后讲什么,讲话的速度等。女生和男生的通话,总是由男生主动发起通话,而总是在男生恋恋不舍的时候,由女生要求。

2024-03-26 19:11:22 1168

原创 什么是线程

为了让业务更快的办理好,张三又找来两位同事李四、王五一起来帮助他,三个人分别负责一个事情,分别申请一个号码进行排队,自此就有了三个执行流共同完成任务,但本质上他们都是为了办理一家公司的业务。线程是操作系统中的概念. 操作系统内核实现了线程这样的机制, 并且对用户层提供了一些 API 供用户使用(例如 Linux 的 pthread 库).// 多线程并不一定就能提高速度,可以观察,count 不同,实际的运行效果也是不同的。不同的执行流,但因为办理的都是一家公司的业务,所以票据是共享着的。

2024-03-25 20:10:46 1145

原创 操作系统和进程

一个跑起来的程序就叫做“进程”,进程也叫做“任务”每个进程都对应着一些资源进程是操作系统资源分配的基本单位进程是一个重要的“软件资源”,是由操作系统内核负责管理的。

2024-03-24 20:34:43 1176

原创 Linux常见命令

如果使用 bunzip2 命令解压 filename.tbz 文件,则 filename.tbz 会被删除,以 filename.tar 代替。如果使用 gunzip 命令解压 filename.tgz 文件,则 filename.tgz 会被删除,以 filename.tar 代替。执行 ping 命令,它会使用 ICMP 传输协议,发出要求回应的信息,若远程主机的网络没有什么问题,就会回应信息,因而得知该主机运作正常。执行指定的 shell 命令。使用 tail 命令,可以查看文件结尾的 10 行。

2024-03-23 12:48:05 730

原创 MySQL数据库基础

create database 数据库名;create database if not exists 数据库名;如果存在了就不会创建并且报警告create database if not exists 数据库名 charset 字符集;可以指定数据库的字符集一个MySQL服务器上有很多个数据库,,要进行操作就需要先确定是要针对哪个数据库的use 数据库名;后续操作都是对这个数据进行操作的drop database [if exists] 数据库名;注意:删除数据库其实是非常危险的操作!

2024-03-20 19:01:28 628 1

原创 网络编程基础

以下为一个客户端一次数据发送,和服务端多次数据接收(一次发送一次接收,可以接收多次),即只。长连接:不关闭连接,一直保持连接状态,双方不停的收发数据,即是长连接。以下为一个客户端一次数据发送,和服务端多次数据接收(一次发送一次接收,可以接收多次),即只。约定好请求和响应的数据格式,也就是应用层协议,大家按照约定好的格式来发送和接收,以下为执行。建立连接、关闭连接的耗时:短连接每次请求、响应都需要建立连接,关闭连接;目前的业务,双方都已约定好业务是展示目录下的文件列表,且都只需要一种数据:请求传输的数。

2024-03-19 21:30:30 596 1

原创 关于Java的线程池

System.out.println(Thread.currentThread().getName() + ": 我还。System.out.println(Thread.currentThread().getName() + ": 我即将死去");System.out.println(Thread.currentThread().getName() + ": 我结束了!Thread.currentThread().isInterrupted() 相当于按下开关之后, 开关弹不起来, 这个称为。

2024-03-18 21:56:59 1175

原创 文件操作 和 IO

往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,同时,随着文件越来越多,对文件的系统管理也被提上了日程,如何进行文件的组织呢,一种合乎自然。家,因为从树型结构的角度来看,树中的每个结点都可以被一条从根开始,一直到达的结点的路径所描。即使是普通文件,根据其保存数据的不同,也经常被分为不同的类型,我们一般简单的划分为文本文件。文件由于被操作系统进行了管理,所以根据不同的用户,会赋予用户不同的对待该文件的权限,一般地。其他操作系统上也有类似的概念,例如,软链接(

2024-02-25 21:48:17 911 1

原创 线程安全的集合类

常见的锁策略 注意: 接下来讲解的锁策略不仅仅是局限于 Java . 任何和 "锁" 相关的话题, 都可能会涉及到以下内容. 这 些特性主要是给锁的实现者来参考的. 普通的程序猿也需要了解一些, 对于合理的使用锁也是有很大帮助的. 乐观锁 vs 悲观锁 悲观锁: 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这 样别人想拿这个数据就会阻塞直到它拿到锁。 乐观锁: 假设数据一般情况下不会产生并发冲突,所以在数据进行提交更新的时候,才

2024-02-24 20:29:10 983 1

原创 MySQL索引事务

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引。数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。索引所起的作用类似书籍目录,可用于快速定位、检索数据。索引对于提高数据库的性能有很大的帮助。加快查的速度,降低增删改的速度。也会提高空间的开销要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:1. 数据量较大,且经常对这些列进行条件查询。2.该数据库表的插入操作,及对这些列的修改操作频率较低。

2024-02-07 19:46:23 1078 1

原创 Java的JDBC编程

里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当。前数据行,我们只能来操作当前的数据行。连接池在初始化时将创建一定数量的数据库连接,这些连接。为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问。连接,是无法重复利用的,每次使用完以后释放资源。是可以复用的,每次使用完数据库连接,释放资源调用。方法返回值是一个整数,指示受影响的行数,通常用于。统一处理,通常与特定数据库的驱动类是完全。释放资源(关闭结果集,命令,连接)方法执行后返回单个结果集的,通常用于。

2024-02-06 17:58:06 1001

原创 二叉树的详解

树形结构结点的度:一个结点含有子树的个数称为该结点的度;如上图:A的度为6树的度:一棵树中,所有结点度的最大值称为树的度;如上图:树的度为6叶子结点或终端结点:度为0的结点称为叶结点;如上图:BCHI...等节点为叶结点双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点;如上图:A是B的父结点孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点;如上图:B是A的孩子结点根结点:一棵树中,没有双亲结点的结点;

2024-02-05 20:03:52 1460 1

原创 Java中常用的排序

先选定一个整数,把待排序文件中所有记录分成个组,所 有距离为的记录分在同一组内,并对每一组内的记录进行排序。把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到。:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持。:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。希尔排序法又称缩小增量法。

2024-02-04 22:18:30 550 1

原创 LinkedList与链表

假设链表带环,两个指针最后都会进入环,快指针先进环,慢指针后进环。此时,两个指针每移动一次,之间的距离 就缩小一步,不会出现每次刚好是套圈的情况,因此:在满指针走到一圈之前,快指针肯定是可以追上慢指。点中,然后通过引用将节点连接起来了,因此在在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。让一个指针从链表起始位置开始遍历链表,同时让一个指针从判环时相遇点的位置开始绕环运行,两个指针。快慢指针,即慢指针一次走一步,快指针一次走两步,两个指针从链表其实位置开始运行,如果链表。如果链表无环,则返回。

2024-01-31 22:42:26 1253

空空如也

空空如也

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

TA关注的人

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