
笔记
文章平均质量分 94
zhangphh
欲戴王冠,必承其重
展开
-
TCP、UDP与IP首部
1、TCP首部1、TCP虽然是面向字节的,但传输的时候数据单元却是报文段,一个TCP报文段分为首部和数据两部分,TCP的首部前20个字节是固定的,后面的4n个字节根据需要来增加,因此TCP报文最小的长度为20字节。引用一张图各字段含义如下:1、源端口和目的端口:顾名思义,各占两个字节;2、序号,占4个字节,范围是0-2^ 31 -1,序号采用的是 mod 2 ^ 32,当到达最大之后会再次从0开始,这个序号是用来标识报文段对应的字节的开始和结束范围,例如,一报文段的序号是301,而接待的数据共原创 2020-09-11 17:55:11 · 1707 阅读 · 0 评论 -
HTTP报文
1、请求报文引用两张图一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成。请求行有请求方法、请求URL、请求HTTP协议的版本请求方法有这么几种:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT1.1、请求方法:①、GET传递参数长度受限制,因为传递的参数是直接表示在地址栏中,而特定浏览器和服务器对url的长度是有限制的。因此,GET不适合用来传递私密数据,也不适合拿来传递大量数据。一般原创 2020-08-14 15:31:13 · 332 阅读 · 0 评论 -
TCP三次握手与四次挥手
1、TCP三次握手建立连接引用一张图三次握手过程:①、客户端向服务端发送请求,将首部中的同步字段(SYN)置为1,只有SYN = 1才能表明客户端想建立连接,并随机选择一个初始序列号x,但此时SYN中并没有携带数据,但是仍然要消耗一个序列号,也就是说下次发送的时候序列号seq = x + 1,此时进入同步已发送状态。②、服务器收到客户端的请求,将SYN和ACK都置为1,SYN为1表示服务端想要与客户端建立连接,ACK表示服务端同意与客户端建立连接,确认号为x+1,表示服务端下次想要接收的报文的第原创 2020-08-11 11:46:53 · 281 阅读 · 0 评论 -
查漏补缺
1、CMS与stop-the-worldSTOP THE WORLDstop the world意味着从应用中停下来并进入到GC过程中去,一旦stop-the-world发生,除了GC所需要的线程外,其他线程都将停止工作,中断了的线程直到GC任务结束才继续它们的任务。CMS收集器是一种以获取最短回收停顿时间为目标的收集器,CMS收集器是基于“”标记–清除”(Mark-Sweep)算法实现的,整个过程分为四个步骤:①、初始标记,会引起stop-the-world,只标注对象是否到GC-Roots存在原创 2020-08-10 17:44:23 · 230 阅读 · 0 评论 -
Redis五种数据结构底层实现简析
1、字符串Redis的字符串是基于C语言的,没有Java这种操作字符串的类库,因此Redis自动封装了一个,为SDS(Simple Dynamic String),SDS中包含了三个属性:len,buf中已经占有的字符串长度(字符串实际长度)free,buf中未使用的缓冲区长度buf[ ],实际保存字符串的地方因此获取字符串长度时间复杂度为O(1),buf[ ]中采用了C语言的\0结尾,因此可以使用C语言的标准字符函数。分配原则:当字符串长度小于1MB时,分配字符串时分配空间的大小为字符串长转载 2020-08-02 15:23:15 · 5142 阅读 · 0 评论 -
ConcurrentHashMap
概述HashMap是线程不安全的,当多个线程同时put的时候可能会导致死锁,针对这一点,有HashTable可以解决,但HashTable效率很低,使用synchronized加锁,导致多个线程竞争同一把锁,于是出现了ConcurrentHashMap。1、ConcurrentHashMap-1.7相比于将整个HashMap锁住,采用分段锁将HashMap分为几段分别加锁,这样就减少了锁的竞争。ConcurrentHashMap使用分段锁技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一原创 2020-07-27 13:43:22 · 131 阅读 · 0 评论 -
线程池与阻塞队列
1、概述由于频繁的创建和销毁线程会消耗很多资源,因此线程池应运而生来去除频繁的创建与删除线程这一过程。2、常见线程池①、newSingleThreadExecutor单一线程池,使用唯一的工作线程执行任务,保证所有任务按照指定顺序执行。ExecutorService service = Executors.newSingleThreadExecutor();底层实现是FinalizableDelegatedExecutorService包装的ThreadPoolExecutor实例publi原创 2020-07-27 11:23:29 · 1184 阅读 · 1 评论 -
ThreadLocal常用操作及原理
概述ThreadLocal并不是为了解决线程间共享变量的问题,而是提供线程内部共享变量,在多线程环境下可以保证各个线程之间的变量相互独立互不影响。可以通过set()/get()方法设置和获取元素值。1、get()方法public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e原创 2020-07-24 14:53:07 · 263 阅读 · 0 评论 -
Java多线程相关
1、Java中的线程调度算法一种是分时调度,让所有的线程轮流获得CPU的使用权,并且平均分配每个线程占用的CPU时间片。另一种是抢占式任务调度,可以让优先级高的优先执行,如果优先级相等就随机选一个执行。线程调度器: 是一个操作系统服务,负责为一个可运行状态的线程分配CPU时间片。一旦创建一个线程并启动它,它的执行便依赖于线程调度器的实现。时间分片 是指可用的CPU时间片分配给可用的就绪线程的过程2、sleep()函数与wait()函数的区别sleep()不会释放锁,是Thread类的方法;原创 2020-07-24 13:42:31 · 209 阅读 · 0 评论 -
基于ReeentrantLock的AQS实现
概述AQS,AbstractQueuedSynchronizer,是一个抽象类,定义了同步状态的获取和释放方法来供自定义的同步组件使用,AQS的实现依赖于内部的同步队列(FIFO),当线程获取同步状态失败后就会被封装成一个Node节点加入同步队列的尾部,并阻塞该线程,当同步状态释放时唤醒队列头节点。AQS中最重要的三个成员变量private transient volatile Node head;private transient volatile Node tail;private volat原创 2020-07-23 15:04:18 · 148 阅读 · 0 评论 -
线程与进程
1、线程与进程的区别与联系①、进程,进程是操作系统资源分配和调度的最小单位,在系统中一般是一个程序的执行。②、线程,线程是处理器任务调度和执行的基本单位,一个进程有多个线程。为什么切换线程比切换进程开销小对于一个程序来说,进程启动后会使用很多资源,比如寄存器、内存、文件等,这些在进程切换的时候必须要考虑保存当前进程的状态,包括存放在内存中的程序的代码和数据、栈、通用寄存器的内容、程序计数器、环境变量以及打开的文件描述符的集合,这个状态叫做上下文。在一个进程中包含了很多线程,每个线程也都有自己的上下原创 2020-07-22 16:29:03 · 107 阅读 · 0 评论 -
Java NIO基本概念
综述NIO是Java1.4之后的新的一套IO接口,可以理解为非阻塞而不仅仅是new。1、IO与NIO的区别IO是面向流的,如字节流和字符流;而NIO是面向缓冲的。IO是阻塞的,NIO是非阻塞的。NIO有选择器,而IO没有。2、NIO基本概念①、SelectorNIO引入了Selector选择器来监听多个通道事件,可以将多个通道注册到同一个Selector选择器中,然后创建一个线程管理这个选择器,这种情况下一个线程可以管理多个通道,并能够知道读写事件是否做好准备。②、Channel和B原创 2020-07-17 17:49:44 · 294 阅读 · 0 评论 -
IO多路复用select,poll,epoll
多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select/poll传入多个文件描述符(FileDescription 简称FD),如果有一个文件描述符准备就绪就返回,否则一直阻塞到超时。IO多路复用是一种机制,一个进程监控多个文件描述符,一旦某个文件描述符准备就绪就通知进程执行相应的IO操作,但select、poll、epoll本质上是同步IO,需要在读写事件就绪后自己负责读写,也就是说这个读写过程是阻塞的。而异步IO无需自己处理读写,而是把读写交给了内核。与多线程原创 2020-07-15 17:41:58 · 205 阅读 · 0 评论 -
Java IO流
综述流代表任何有能力产出数据的数据源对象,或者是有能力接受数据的接收端对象。流的本质是数据传输,根据数据传输类型,将流分为各种类,分别操作。1、装饰者模式装饰,类似于装饰房间,每添加一件装饰物品,房间气氛都会改变,装饰者模式也起到这样的作用,动态的为一个对象添加其他功能,装饰者提供了一种灵活的方式来替换继承。装饰者模式的框架如下:Component,也就是我们需要装饰的对象,他是抽象的,定义了一些方法,实际上要装饰的就是它的方法。ConcreteComponent,上述对象子类化后的对象,原创 2020-07-15 16:11:55 · 135 阅读 · 0 评论 -
Java泛型
综述泛型,也即参数化类型,所谓的参数化类型,也就是将原来的具体的类型参数化,类似于方法中的类型参数,此时参数的类型也定义成了参数形式,然后在调用时传入具体的类型。泛型的本质就是参数化类型,也就是在泛型使用的过程中操作的数据类型被指定为一个参数,这种类型可以用在类、接口和方法中,分别构成泛型类、泛型接口和泛型方法。1、泛型的特性泛型只在编译阶段有效,在编译之后程序会采用去泛型化的操作,下面的例子就可以证明:List<String> stringList = new ArrayList&l原创 2020-07-15 10:20:12 · 96 阅读 · 0 评论 -
Java stream流
综述stream流提供可以以一种声明的方式处理数据,是一个来自数据源的元素队列并支持聚合操作。原元素是特定类型的对象,形成一个队列。stream并不会存储元素,而是按需计算。数据源 也即是流的来源,可以是集合、数组、IO/channel等。聚合操作,如filter, map, reduce, find, match, sorted等。要得到一个stream通常不会手动创建,而是调用已存在的方法如:Collection.stream()Collection.parallelStream()原创 2020-07-15 09:36:46 · 338 阅读 · 0 评论 -
Collections与Arrays常用函数
一、Collections估工具类1、Collections.sort()排序函数此方法是对List类型的数据进行排序,对于自定义的实体类存入的list想要调用此函数排序,则实体类要实现Comparable接口并重写compareTo()方法,也可以实体类不实现Comparable接口,但是需要自定义一个类实现Comaprator接口并重写compare()方法。Collections.sort()的两种形式public static <T extends Comparable<? su原创 2020-07-14 15:17:47 · 278 阅读 · 0 评论 -
Java集合类之HashMap
综述HashMap是一个存储键值对(Key-value)的集合,每一组键值对也叫做Entry,HashMap数组的初始化都是null。1、成员变量//初始化容量为16,这个必须是2的幂static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;//负载因子static final float DEFAULT_LOAD_FACTOR = 0.75f;//大于这个阈值会将链表转化为红黑树static final int TREEIFY_THR原创 2020-07-14 13:50:40 · 487 阅读 · 0 评论 -
理解红黑树插入与删除
综述红黑树是一个自平衡的二叉查找树,在插入和删除等可能破坏树的平衡时需要自动调整平衡,红黑树的定义就是红黑树是一种含有红黑结点并能自平衡的二叉查找树。红黑树的性质①、每个节点要么是红色的要么是黑色的;②、根节点是黑色的;③、每个叶子节点(NIL)都是黑色的;④、每个红色节点的两个子节点一定都是黑色的;⑤、任意一节点到每个叶子节点的路径都包含相同数量的黑色节点从性质⑤可推出结论:如果一个节点存在黑色的子节点,那么这个节点肯定有两个子节点。关于左旋和右旋问题,以下面两张图为例进行理解:原创 2020-07-13 19:37:47 · 437 阅读 · 0 评论 -
Java集合类之ArrayList
概述图片来自菜鸟教程由图可知,Java集合框架主要由两部分组成,一个是集合Collectin,另一个是图Map,Collection接口有三个子接口,这三个子接口下面是一些实现的抽象类,再往下就是一些实现,之所以定义这么多的接口就是为了适应不同类型的操作。1、Collection接口查看Collection接口源码,其中定义了常用的add(),get(),remove(),retainAll()(取交集)等方法。Collection接口定义了sort()排序函数,其实现是调用Arrays.so原创 2020-07-13 14:50:03 · 301 阅读 · 0 评论 -
HTTP与HTTPS
1、HTTPHTTP是一个超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,基于TCP/IP协议传输数据。特点:无状态:协议对客户端没有状态存储,不具有记忆能力,如访问一个网站需要进行重复登录;无连接:HTTP/1.1之前,由于无状态的原因,客户端每次建立连接都需要使用TCP进行三次握手,如果一个客户端在短时间内多次请求服务端,服务端每次都需要重新响应,造成不必要的时间浪费;基于请求和响应:有客户端发起请求,服务端响应;简单快速;通信使用明文,请求和响应不会对通信方进行确认,无法原创 2020-07-09 18:14:59 · 404 阅读 · 0 评论 -
SSM回顾注意事项一
1、配置文件扫描包相关<context:component-scan base-package="com.xxx,com.yyy"/>可以用逗号隔开扫描多个包;如果像扫描本包下所有的service子包(这些service子包有不同的父包),可以如下配置:<context:component-scan base-package="com.a.**.service"/>context:component-scan默认开启了<context:annotation原创 2020-05-22 10:35:41 · 237 阅读 · 0 评论