- 博客(45)
- 收藏
- 关注
原创 RPC-thrift总览
RPCrpc全称Remote Procedure Call,也就是远程过程调用,通俗的说,就是在本地调用一个远程的方法,这个调用过程是透明的。对于rpc,我首先想到的是进程间通讯,其中Socket就是完成远程进程间通讯。从网络的角度看,运输层抽象的Socket做到了ip的分用及复用,也就是通过端口,完成了进程间通讯。所以rpc可以看作是一种特殊的网络通讯。网络栈所以,rpc就需要有网络连接(传输层)、RPC协议(应用层),还需要序列化来完成对象的传输,最后为了使用的便捷、透明,使用者无感知,还
2020-11-02 22:12:51
321
原创 [数据结构与算法-理论] Hash表
文章目录1. 概念1) Hash表2) Hash函数2. Hash冲突1) 必然发生Hash冲突2) Hash函数的要求3) 解决Hash冲突(1) 开放寻址法1. 线性探测2. 二次探测3. 双重散列(哈希)(2) 链表法3. Hash表扩容1. 概念1) Hash表Hash表也叫哈希表、散列表,(我的理解)它是一种特殊的数组。数组是支持随机访问的一种数据结构,我们可以根据下表直接访问内容...
2020-01-17 21:59:29
627
原创 [嵌入式操作系统] 嵌入式操作系统复习
嵌入式系统的定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,适用应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。嵌入式系统的特点:系统资源受限的系统-面向特定应用的大多要求低功耗要求较高的可靠性和稳定性有实时约束需要专用工具和特殊方法开发工具和方法:资源有限,不具备自主开发能力,产品发布后用户也不能对软件进行修改,必须有一套专门的开发环境。...
2020-01-01 17:24:15
928
原创 [嵌入式操作系统] 优先级位图算法
文章目录1. 前提2. 优先级就绪表3. 任务进入就绪态1) 优先级就绪组2) 优先级映射表3) 修改优先级就绪表4. 任务退出就绪态5. 获取最高优先级1) 优先级判定表1. 前提在ucos系统中,任务调度按照优先级调度算法,从就绪队列中选取优先级最高的任务进行调度。那么首先我们就要解决如何找到最高优先级的任务。一种方法,我们可以从头到尾遍历就绪队列,找到优先级最高的任务。另一种方法,我...
2019-12-31 15:20:12
4714
2
原创 [数据校验] 奇偶校验、海明码
文章目录1. 奇偶校验1) 计算校验码2) 缺陷2. 海明码1) 原理(1) 计算校验位(2) 校验2) 实现1. 奇偶校验计算机中的数据都是用0、1表示的,在物理层面,就是高电平和低电平,这就存在数据出错的可能性。在我们下载文件的时候,我们往往需要确认一下我们下载的文件有没有损坏或者被别人修改过,这时候我们就可以使用奇偶校验来计算校验码再和官方提供的校验码做对比。1) 计算校验码首先讲...
2019-12-29 17:08:27
994
1
原创 [组成原理] 硬盘
文章目录1. 硬盘性能指标1) IOPS2) DTR2. 机械硬盘3. SSD1) 写入、擦除2) 预留空间1. 硬盘性能指标1) IOPS每秒读写次数,在大多数场景下,随机读写的IOPS是核心指标2) DTR数据传输率,也就是吞吐率。2. 机械硬盘机械硬盘由盘面和磁头、悬臂组成。盘面是存储数据的载体,上面有一层磁性涂层,数据就存储在磁性涂层上。在使用的时候,盘面会高速旋转。有一个...
2019-12-29 14:42:13
482
原创 [组成原理] CPU缓存、缓存一致性、MESI协议
文章目录1. CPU缓存2. 直接映射缓存3. 缓存一致性4. MESI协议1. CPU缓存进行服务器端开发的时候,我们会想到添加redis或memcache缓存,来减轻数据库的压力。对于CPU来说,内存实在是太慢了,每次读取数据都要进行长时间的等待,浪费了CPU资源。引入CPU缓存,95%的情况下,CPU只需要访问L1-L3 CPU缓存,而无需访问内存,大大提高了速度。2. 直接映射缓存...
2019-12-26 20:47:28
477
原创 [组成原理] 指令重排序
上一篇:[组成原理] 流水线设计文章目录1. 前提2. 指令重排序1. 前提a = b + cd = a * ex = y * z可以发现,第三条指令并不依赖前两条,在第二条指令等待第一条指令的结果的时候,完全可以先执行第三条指令。2. 指令重排序在取指令和译码之后,会讲指令发到保留站,等待他们所依赖的数据。如果指令依赖的数据准备好了,就会提交到ALU进行计算,计算完成后,会讲...
2019-12-26 15:57:19
350
原创 [组成原理] 流水线设计
文章目录1. 时钟周期、机器周期、指令周期2. 单指令周期处理器3. 流水线设计4. 结构冒险引入缓存5. 数据冒险1) 写后读2) 读后写3) 写后写4) 流水线停顿6. 控制冒险1) 静态分支预测2) 动态分支预测1. 时钟周期、机器周期、指令周期时钟周期是由晶振决定的,晶振的一次震荡我们就叫做时钟周期。我们平时说的处理器的主频就可以理解为单位时间内执行的简单指令,例如3.8GHz主频就是...
2019-12-26 15:21:26
2236
原创 [数据结构与算法-理论]二分查找
文章目录1. 二分查找2. 查找第一个值等于给定值的元素3. 查找最后一个值等于给定值的元素4. 查找第一个大于等于给定值的元素5. 查找最后一个小于等于给定值的元素1. 二分查找public int bsearch(int[] a, int n, int value) { int low = 0; int high = n - 1; // 注意循环条件 whi...
2019-12-24 16:58:11
311
2
原创 [排序算法]桶排序、计数排序、基数排序
上一篇:[排序算法]归并排序、快速排序文章目录1. 桶排序1) 时间复杂度2) 桶排序不是原地排序算法3) 桶排序可以是稳定算法2. 计数排序1) 时间复杂度2) 计数排序不是原地排序算法3) 计数排序是稳定算法3. 基数排序4. 总结1. 桶排序桶排序首先要求我们对数据大概分布有一个了解。比如按照用户的年龄排序,假设用户年龄分布在0-120岁之间,我们可以想象有12个桶,分别存放0-10...
2019-12-24 14:40:35
480
原创 [排序算法]归并排序、快速排序
上一篇:[排序算法]冒泡排序、插入排序、选择排序文章目录1. 归并排序1) 时间复杂度2) 归并排序不是原地算法3) 归并排序是稳定算法2. 快速排序1) 时间复杂度2) 快速排序是原地算法3) 快速排序不是稳定算法3. 总结1. 归并排序// 归并排序使用了分治的思想,首先分,缩小数据规模,然后再将部分结果合并起来public void mergeSort(int[] a) { ...
2019-12-21 13:40:04
636
3
原创 [排序算法]冒泡排序、插入排序、选择排序
文章目录1. 排序算法要关注哪些问题1) 复杂度(1) 时间复杂度(2) 空间复杂度2) 稳定性2. 冒泡排序1) 时间复杂度2) 冒泡排序是原地算法3) 冒泡排序是稳定算法3. 插入排序1) 时间复杂度2) 插入排序是原地算法3) 插入排序是稳定算法4. 选择排序1) 时间复杂度2) 插入排序是原地算法3) 插入排序不是稳定算法5. 总结1. 排序算法要关注哪些问题1) 复杂度对于算法,我...
2019-12-19 19:00:04
1217
6
原创 [数据结构与算法-理论] 时间复杂度
1. 如何衡量代码质量?计算机两个核心的功能就是计算和存储,所以我们衡量代码也是从这两个角度,一个是计算时耗费的时间,一个是计算时使用的存储空间(这里指使用的内存大小)。比较直观的方法就是,运行一下,跑一跑就知道了。占用了多少内存,耗费了多少时间,统计一下,既直观又准确。这种方法不是不可以,只是受运行环境和数据规模影响比较大,参考性很难统一。所以,我们引入了大O表示法,可以在不运行的情况下,...
2019-12-18 16:10:33
218
原创 [集合类] 源码解析10(HashMap类)
上一篇:[集合类] 源码解析9(Map接口和AbstractMap抽象类)1. 概述我们首先看一下HashMap定义,它继承了AbstractMap抽象类,实现了Map、Cloneable、Serializable接口。public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,...
2019-12-15 14:48:52
202
原创 [集合类] 源码解析9(Map接口和AbstractMap抽象类)
上一篇:[集合类] 源码解析8(PriorityQueue类)文章目录1. Map接口1) Entry接口2) 方法2. AbstractMap抽象类1) SimpleEntry2) SimpleImmutableEntry3) 方法实现1. Map接口我们首先看一下Map接口的定义,按照惯例,翻译一下注释。/** * Map是一个将key(键)映射到value(值)的对象。Map不能包...
2019-12-13 14:16:23
272
原创 [集合类] 源码解析8(PriorityQueue类)
[集合类]源码解析7(AbstractSequentialList抽象类和LinkedList类)文章目录1. 属性2. 构造方法3. 重要方法4. 常用方法1) 工具方法2) 集合方法3)队列方法public class PriorityQueue<E> extends AbstractQueue<E> implements java.io.Serializa...
2019-12-11 16:10:47
232
原创 [集合类]源码解析7(AbstractSequentialList抽象类和LinkedList类)
上一篇:[集合类]源码解析6(Queue接口、AbstractQueue抽象类、Deque接口)文章目录1. AbstractSequentialList2. LinkedList1) Node2) 属性3) 构造方法4) 工具方法5) List方法(1) 添加方法(2) 删除方法(3) 修改方法(4) 查找方法6) Deque方法(1) 添加方法(2) 删除方法(3) 查找方法1. Abst...
2019-12-10 20:26:07
183
原创 [集合类]源码解析6(Queue接口、AbstractQueue抽象类、Deque接口)
上一篇:[集合类]源码解析5(ArrayList类、Vector类和Stack类)文章目录1. Queue接口2. AbstractQueue 抽象类3. Deque 接口1. Queue接口Queue接口主要定义了队列的基本方法,下面我们分析注释,了解其实现、使用规则。/** * 设计用于在处理之前保留元素的集合。 除了基本的Collection操作之外,队列还提供额外的插入,提取和检...
2019-12-08 22:56:15
221
原创 [集合类]源码解析5(ArrayList类、Vector类和Stack类)
上一篇:[集合类]源码解析4(List接口和AbstractList抽象类)文章目录1. 概述2. ArrayList1)属性2)构造方法3)常用方法(1)添加方法(2)删除方法(3)修改方法(4)查询方法(5)关键方法(6)其他方法4)System.arraycopy3. Vector4. Stack1. 概述前面我们按照接口为线索,分析了和集合类相关的一些接口以及他们的实现类,下面我们将...
2019-12-05 14:17:13
392
1
原创 [集合类]源码解析4(List接口和AbstractList抽象类)
上一篇:[集合类]源码解析3(Collection接口和AbstractCollection抽象类)1. 概述下面我们一起看一下List接口的定义,以及AbstractList的实现。2. List接口List接口继承了Collection接口,Collection接口中的定义就不重复了,还不了解的给个传送门:[集合类]源码解析3(Collection接口和AbstractCollecti...
2019-12-04 16:05:41
230
原创 [集合类]源码解析3(Collection接口和AbstractCollection抽象类)
1. 概述我们首先看一下Collection接口的javadoc,之后看一下在AbstractCollection中的实现。2. Collection接口下面是Collection中定义的接口列表,其中equals和hashCode是继承自Object,iterator方法是继承自Iterable,我们已经分析过,传送门:[集合类] 源码解析2(Iterator的实现)下面是Collec...
2019-12-04 11:14:56
266
原创 [集合类] 源码解析2(Iterator的实现)
Iterator源码分析上一篇[集合类] 源码解析1(Iterable、RandomAccess、Serializable、Cloneable分析都写在代码注释中了,希望大家耐心读。1. 整体接上一篇文章,这一篇我们来详细分析一下Iterator接口,以及常见的实现。下面是常用类的类图,没有Set是因为Set是一种特殊的Map,这个后面再说。下面是接口定义,定义了迭代器的基本操作。p...
2019-11-29 16:39:56
604
4
原创 [集合类] 源码解析1(Iterable、RandomAccess、Serializable、Cloneable)
集合类是我们每天都在使用的工具。工欲善其事,必先利其器。下面我们从源码的角度来看看集合类中的奥秘。1. 整体下面图片是整体的架构,这里只表现了类和接口类的继承实现关系,选取了平时使用比较多的类,如LinkedList、ArrayList、HashMap、TreeMap等,没有考虑并发容器。集合类分为两个体系,Collection和Map。我们先看Collection。1)Collection...
2019-11-26 22:31:44
416
1
原创 [java]语法糖?甜么?
1. 什么是语法糖语法糖是指为了方便程序员使用的一种语法结构,在编译期间会被转换为基础的语法结构。其实我们每天都在和语法糖打交道,只是我们自己不了解。下面我们看看在Java中都有哪些语法糖。2. Java中的语法糖1)switch支持String在switch中比较的是String的hashcode。class SwitchDemo { public static void ma...
2019-11-25 15:34:49
255
原创 [并发]Immutable 不变模式
Immutable不变模式并发问题是由于不同线程共同操作共享内存,导致读写顺序错乱,影响了共享内存的值。那么,如果线程只读操作共享内存,就不存在并发问题了。1. 如何实现不变性第一,需要类本身是final的,防止子类继承他而修改不变性。第二,需要类的属性都是final的,并且只存在读方法。第三,使用深拷贝修改对象,简单说就是在修改对象时,new一个新的对象返回。Java中有一个很好的...
2019-11-25 13:13:02
245
原创 [java] Java基础
1. 基础特性1) 面向对象面向对象是一种编程思想,是使用类或对象作为组织代码的基本单元,具有继承、封装、多态三大特性。继承用来表示类之间的关系,主要作用就是实现代码复用。封装就是控制类的访问权限,只开放出对外的方法,并抽象出接口类,供使用者操作。一方面,让数据更安全,另一方面,也提高了易用性。多态简单说就是子类替换父类,或者实现类代替接口类。多态提高了代码的可拓展性和复用性,一方面,在...
2019-11-24 19:49:27
343
1
原创 [java] String探秘
String类由于我们每天都在和String打交道,他已经重要的让我们无法感知它的存在,正因如此,他的性能问题也最容易被忽视。下面让我们从源码的角度来看看,String类有哪些奥秘。(以下代码使用jdk1.8)1. 存储结构首先可以看到,String存储结构是char数组。private final char value[];2. 不可变可以看到,String类本身以及其属性都是fi...
2019-11-24 13:56:17
376
1
原创 Netty 源码跟踪(一)-- netty启动
1. 概述使用2019.11.6日4.1版本最新源码。源码下载:链接:https://pan.baidu.com/s/19R-rtyT0ffyv3NAOrZKJ5Q 密码:5xhp为了方便理解,文中代码做了适当简化。2. 服务端创建代码示例来自netty源码io.netty.example.echo包中EchoServer类EventLoopGroup bossGroup = ne...
2019-11-07 21:18:48
201
2
原创 java.lang.IllegalStateException: Failed to register dubbo://10.3.5.176:20880
curator4.0与zookeeper3.4.X有依赖冲突,需要exclude curator 的zookeeper依赖,并重新引入zookeeper3.4,如下。<dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</a...
2019-11-05 19:22:07
1126
原创 java.lang.NoClassDefFoundError: org/apache/curator/RetryPolicy
通过引入下面依赖解决<dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>4.0.1</version></dependency><...
2019-11-05 19:18:37
2662
原创 java.lang.NoClassDefFoundError: com/alibaba/spring/util/PropertySourcesUtils
引入 spring boot 和 dubbo 后会出现错误java.lang.NoClassDefFoundError: com/alibaba/spring/util/PropertySourcesUtils通过引入下面依赖解决<dependency> <groupId>com.alibaba.spring</groupId> <art...
2019-11-05 19:16:53
3405
1
转载 Spring Data操作Redis时,发现key值出现 \xac\xed\x00\x05t\x00\tb
最近在研究redis,以及spring data对redis的支持发现了一个奇怪的现象先说现象吧,通过redisTemplate下的opsForHash方法存储hash类型的值,操作成功以后,去redis控制台显示keys * 的时候,发现一个奇怪的现象,插入的hash类型的key前面会有一堆的\xac\xed\x00\x05t\x00\tb 这种东西,见图1(图1)看见了吗?就是第二行那一...
2019-11-05 12:39:08
127
原创 Java实现线程安全的单例模式 -- 5种方法的演进
前言:单例模式是一种对象创建模式,确保系统中一个类只产生一个实例。本质上和池化技术的目的是一样的。对于频繁使用的对象,可以省略创建和销毁的开销,尤其对于重量级对象而言。其中重要的问题就是是否支持延迟加载,以及延迟加载带来的线程安全问题。饿汉由于instance是静态的,也就是类变量,所以会在类加载的初始化阶段就会生成实例。由于类加载一定是只执行一次的,当然他是线程安全的。具体可以看另一...
2019-10-26 14:45:23
174
原创 记一次jvm类加载相关的问题
今天同学问了一个问题:为什么类的static引用可以指向一个自己的类实例。所以我们先做个实验,看一下如果不是static的引用会发生什么发生了栈溢出。那么如果是static引用呢?可以看到,程序没有问题。翻看了周志明先生的《深入理解Java虚拟机》,我似乎找到了答案。总结一下。不是静态的类成员变量,在对象实例化的时候随对象一起分配在Java堆中。那么类的成员变量,在准备阶段...
2019-10-21 14:01:27
201
原创 网络攻击手段
1. SQL注入主要是由于sql语句使用字符串拼接,黑客上传的字符串很有可能彻底改变原字符串的作用,杀伤力极强。解决办法就是使用绑定参数的办法生成sql语句,或者使用mybatis等框架进行绑定参数。2. XSS 跨站脚本攻击主要分为反射型、存储型、DOM型。主要是黑客使用技术手段,在用户的html中插入恶意脚本。或者通过抢红包、中奖信息等假消息诱导用户将代码粘贴到浏览器console中运...
2019-10-13 22:44:39
147
原创 获取系统变量System.getProperty() && jinfo工具
今天用到了,System.getProperty(“user.dir”);想看一下都有哪些系统属性,如是有了下面的测试代码。class Test { public static void main(String[] args) { Properties properties = System.getProperties(); for (String ke...
2019-10-12 22:17:46
201
原创 粘包半包 和 netty 中的四种拆包器 三种读半包解码器
1. 粘包是什么?粘包半包是发生在TCP协议阶段的一种现象。粘包,就是在接受数据时,多个发送过来的TCP包“粘”在了一起。也就是一次性读到了发送的多个通信包 ,粘在一起,如果不能正确的将这些包分隔开,我们就没办法处理请求数据。怎么办?那么解决这个问题的思路就是,按照我们规定好的格式来,如果从TCP底层读到了多个应用层数据包,则将其拆成一个一个的独立的应用层数据包,返回上层应用,这个过程通常...
2019-10-11 19:01:56
496
1
原创 2000行代码 -- 手写Server + 手写SpringMVC(附源码)
1. 架构整个系统分为两个部分,server和servermc。其中server负责网络通信部分和协议的解析,主要使用Java NIO 编写。servermc之所以没有mvc中的v,是因为系统中没有提供对view视图的支持。目前只提供了json格式的数据交互2. server...
2019-10-03 20:09:16
343
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人