UDP协议 把当前要计算校验和的数据,每个字节,都进行累加,把结果保存到这两个字节的变量(校验和)中,过程中溢出也没关系,如果中间某个数据,出现传输错误,第二次计算的校验和就会和第一次不同(CRC这个算法其实不是特别靠谱,比如如果前一个字节大小少1,后一个字节大小多1,那么最后得到的校验和任然相同,但是数据可能已经不同了)。描绘这个数据报的报文长度(包含报头),这里的长度是指该报文有多少个字节,因为只有16位比特位的大小,因为数据传输可能会出错,所以需要一定的方法知道所传输的数据是否正确传输。
网络编程详解 socket是文件描述符表里的一个表项,每打开一个文件,就会占用里面的一个位置,文件描述符表是再pcb上的(跟随进程),这个socket在整个程序运行中都是需要使用的,不能提前关闭,当socket不再使用的时候,就意味着程序就要结束了,进程结束此时文件描述符表,就随着pcb销毁了,随着销毁的过程中,socket就被系统回收了。
常见的锁策略 顾名思义就是比较悲观的锁策略,在每次拿数据时总感觉会有其他人会对数据进行修改导致自己拿到一个无效数据,所以每次拿数据时都会进行加锁,这样别人想修改就会阻塞等待。认为数据一般情况下不会发生并发突变,在数据进行提交更新的时候,才会对数据是否产生并发冲突进行检测,如果发现并发冲突了,就返回用户错误的信息,让用户决定如何去做。假如有两个朋友要找你出去玩,友人A比较悲观,认为你可能比较忙,会先发个消息“今天下午三点有空吗,出来玩”(将相当于要给你加锁),如果你有空他就可以来找你,如果没有他就会等待你有空之后再来找你。
工厂模式详解 现在这个快餐店为了更好的销售产品,推出了一系列的套餐。抽象工厂模式提供了一个接口,用于创建一系列相关对象,而不是一个单一的对象。它允许客户端使用抽象接口来创建一整套相关的对象,而不必指定具体类抽象产品//抽象食物接口具体产品//薯条@OverrideSystem.out.println("做了一个薯条");//炸鸡@OverrideSystem.out.println("做了一个炸鸡");//汉堡@OverrideSystem.out.println("做了一个汉堡");//可乐。
《javaEE篇》--线程池 线程的诞生是因为进程创建和销毁的成本太大,但是也是相对而言,如果频繁的创建和销毁线程那么这个成本就不能忽略了。一般有两种方法来进一步提高效率,一种是协程(这里不多做讨论),另一种就是线程池假如说有一个学校食堂窗口的老板想到给学生提供外卖服务,而且有一个奇妙的想法,每当需要送外卖就现场雇一个学生来送,然后解雇。(就相当于平时的有一个任务就创建一个线程来处理),但是老板还是觉得频繁的雇佣和解雇学生的成本太大,于是老板又有一个点子。指定一个指标,外卖员的人数扩张到3个人,但还是随着外卖的数量逐步雇人。
《javaEE篇》--定时器 当我们不需要某个线程立刻执行,而是在指定时间点或指定时间段之后执行,假如我们要定期清理数据库里的一些信息时,如果每次都手动清理的话就太麻烦,所以就可以使用定时器。定时器就可以比作一个闹钟,可以让我们的线程在指定的时间执行,还可以指定时间循环执行。
《javaEE篇》--单例模式详解 饿汉模式:在类加载时创建对象,通过方法直接返回该对象,不会出现并发安全问题懒汉模式:在第一次需要对象是才会创建对象,但会有并发问题,建议使用Double Check(双重检验) + Lock(加锁)可以很好的解决问题为了在多线程环境下防止,疑问指令重排序而导致代码出现问题,要使用volatile修饰对象以上就是博主对线程知识的分享,在之后的博客中会陆续分享有关线程的其他知识,如果有不懂的或者有其他见解的欢迎在下方评论或者私信博主,也希望多多支持博主之后和博客!!🥰🥰下一篇博客博主将分享有关。
《JavaEE篇》--多线程(2) 线程之间的共享变量存在主内存(实际物理内存)中,而且每一个线程还有自己的工作内存(寄存器/cpu高速缓存),当线程要读取一个共享变量时,会把变量从主内存拷到工作内存中,再从工作内存读取数据,当线程要修改一个共享变量时,也会先修改工作内存中的副本,在同步到主内存中。计算机运行的程序,经常要访问数据,这些数据往往会存储在内存中(比如,定义一个变量,变量就会存储在内存中),当cpu使用这个变量的时候,就会把这个变量,先从内存中读出来,再放到cpu的寄存器中,最后在参与运算。那么我们如何保证线程是安全的?
《javeEE篇》--多线程(1) 进程是操作系统对一个正在运行的程序的一种抽象,又或者说,可以把进程看作程序的一次运行过程(通俗的讲就是跑起来的程序)。而且在操作系统内部,进程是资源分配的基本单位PBCPBC的中文翻译是进程控制抽象,在计算机内部要管理任何现实事物,都需要将其抽象成一组有关联的、互为一体的数据。PBC就相当于是对进程的抽象,里面包含了描述一个进程的各种属性,每一个PBC对象就代表着一个进程。在操作系统中,会有很多进程那么,操作系统对这些进程进行管理,管理的方法是。
《mysql篇》--JDBC编程 低耦合:用来描述代码模块之间的依赖程度,列如有两个模块A,B其中B依赖A,那么每次A修改后都要修该B,那么A,B间就是耦合的高内聚:表示某个特定的软件模块内部,是由很多相关性很强的代码构成,每个模块只负责一项任务,一个功能可以由各个模块通过聚合或组合等达到高度内聚,这样即使聚合的内容发生改变,也不用做很大的变动就等轻松的达到扩展的目的接下来我们来介绍一下使用到的方法都是什么作用🤔首先你是不是对。
《mysql篇》--索引事务 我们先来举一个例子,假如我们现在要去银行把钱转账给另一个人,那么把这个操作简化为MySQL语句的话,就是我的账户删除一条数据,另一个人的账户插入一条数据,那么假如中间出现了错误,我的账户少了,另一个人的账户没有变,这样的场景显然是不合理的。事务就是将多条sql语句打包为一个整体,要么都执行,要么都不执行,事务把多个sql打包为一个整体来执行,称之为“原子性”(意为不可再拆分)。
《mysql篇》--查询(进阶) 可以看作两个表相乘,在数学符号中,如果A = {a, b} 且 B = {1, 2},那么A × B的笛卡儿积为{(a, 1), (a, 2), (b, 1), (b, 2)}。//计算笛卡尔积时要注意如果两张表数据量都比较大时,就要考虑能不能使用笛卡尔积,因为笛卡尔积的表的数据量是,两张表的乘积如果数据量过大,可能会卡死服务器;外连接和内连接正好相反,外连接是尽可能显示较多的数据,即使表1没有数据为了显示表2数据,也会以null的形式显示表1;实际开发中往往数据来自不同的表,所以需要多表联合查询。
《mysql》--mysql约束 有的时候数据库中的数据是有一定要求的,有些数据认为是合法数据,有些是非法数据,如果靠人工检查显然是不靠谱的;数据库会自动的对数据的合法性进行校验检查目的就是,保证数据中能够避免被插入/修改一些非法的数据//这些约束一般都是在创建表时添加上的在创建表时在所对应的字段后面加上not null该列字段就不能为空举例: create table student1(name varchar(20) not null,age int,score int,calss varchar(20));
《mysql篇》--mysql常用命令 - 单行插入: insert into 表(字段1, ..., 字段N) values (value1, ..., value N);-- 多行插入: insert into 表(字段1, ..., 字段N) values (value1, ...), (value2, ...), (value3, ...);-- 全列查询: select * from 表-- 指定列查询:select 字段1,字段2... from 表。
《java数据结构》--哈希表 大概方法就是,将表中的每一个位置加上一个状态,状态有三种,空,有值,删除,删除状态就是这个位置之前有值但是现在被删除了,但是这个位置的值并没有改变,而是将状态设定为删除,这样我们进行其他操作就能知道那些时不用选中的了,这样我们即完成了删除又可以找到另一个冲突的值。,当然不是,如果只是简单的将原来的数据拷贝过来,这时数组大小扩容总空间变大,根据我们的哈希函数。如果不扩容的话,表的长度就是一定的,负载因子就和“插入表中的元素个数”成正比,所以,负载因子越大,表明插入表中的元素越多,冲突产生的概率越大;
《java数据结构》--详解Map和Set Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。这两种排序一般用在静态查找,在查找时一般不会进行插入和删除,但现实中我们需要的往往是动态查找,即在查找时会进行一些插入和删除操作。这时就要用到map和set了,这两个是一种适合动态查找的集合容器。
《java数据结构》--一篇解决二叉搜索树!! 我们可以根据二叉搜索树的特性,它的每一个结点的左子树比根小右子树比根大来进行快速查找,当一个数比根结点小就往根结点的左边找,比根结点大就往右边找,每次都可以将搜索范围缩小一半,最多查找h(树的高度)次,一个相对平衡的二叉树搜索树的时间复杂度大概为O(logN),为什么要说相对平衡呢?这种情况利用上面的方法依然可以实现,比如cur在父节点的右边,因为cur没有子树,所以不管父节点连cur的左边还是右边(左右都为null)都可以完成删除,cue在父节点左边也是一样的,所以这部分内容利用上面的代码也能实现。
《java数据结构》--队列详解 我们一般将如数据的操作叫入队,入队的一端称作队尾,取出数据的操作叫做出队,出队的一端称作队头,根据上面的图我们可以发现元素1是最先入队的并且是最先出队的。我们要注意的是在java中Queue是一个接口,不能直接实例化,但是LinkedList实现了Queue接口(它的底层是用一个双向链表实现的),可以用Queue接口去实例化LinkedList对象😉。的原则,栈是只有一端可以存取,队列是一端存,一端取。博主这里也是用链表来实现的,为了方便进行尾插,这里我们不仅定义一个头结点还定义一个尾结点。
《java数据结构》--栈的详解 栈是一种不同于链表和顺序表的储存数据结构,它对存储数据和取出数据有着特殊的要求🤔。首先栈只能从一端存储数据,这也是栈最大的特点,这也导致在栈中存取数据都必须遵循的原则😊,即先存入的数据只能最后拿出来,嗯🤔你可以把它想做一个细长的圆桶,你要往里放东西肯定是先放在最下面,当放满这个圆桶后你要再拿出刚开始放的那个,就必须把它上面的东西都拿出来才行。下面我来画图演示一下(画的不好请见谅🦊):一般我们将栈用来存取的一端叫做我们常常说取栈顶元素就是去取离栈顶最近的元素(也就是图中的3),另一端叫做。