- 博客(22)
- 收藏
- 关注
原创 Netty对于粘包和拆包问题的解决方案
前言 什么是粘包拆包? 拆包和粘包是在socket编程中经常出现的情况,在socket通讯过程中,如果通讯的一端一次性连续发送多条数据包,tcp协议会将多个数据包打包成一个tcp报文发送出去,这就是所谓的粘包。而如果通讯的一端发送的数据包超过一次tcp报文所能传输的最大值时,就会将一个数据包拆成多个最大tcp长度的tcp报文分开传输,这就叫做拆包。 我们看一下下面这张图就知道了: 粘包拆包产生的原因 数据流在TCP协议下传播,因为协议本身对于流有一些规则的限制,这些规则会导致当前对端接收到的数据包不
2021-03-15 23:02:22
1086
原创 ConcurrentModificationException异常原因和解决方法
首先看一下一个例子举出 ConcurrentModificationException 的出现场景: public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(){ { add(1); add(2); add(3); } }; Iterator&
2021-02-25 23:59:17
96237
3
原创 java对象的内存构
java对象在内存中布局 java通过 new 来创建一个实例对象,对象存于内存的堆中并给其分配一个内存地址,那么问题来了 这个实例对象是以怎样的形态存在内存中的? 一个Object对象在内存中占用多大? 对象中的属性是如何在内存中分配的? 在 JVM 中,Java对象保存在堆中时,由以下三部分组成: 对象头(object header):包括了关于堆对象的布局、类型、GC状态、同步状态和标识哈希码的基本信息。Java对象和vm内部对象都有一个共同的对象头格式。 实例数据(Instance D
2021-01-25 16:49:56
342
原创 进程通信的6种方式
进程通信 IPC (Inter Process Communication) 1、管道/匿名管道 比如下面 Linux 命令行 netstat -tulnp | grep 8080 其中 ”|“ 是管道的意思,它的作用就是把前一条命令的输出作为后一条命令的输入。在这里就是把 netstat -tulnp 的输出结果作为 grep 8080 这条命令的输入。如果两个进程要进行通信的话,就可以用这种管道来进行通信了,并且我们可以知道这条竖线是没有名字的,所以我们把这种通信方式称之为匿名管道。并且这种通信方
2021-01-22 22:30:41
1809
原创 HTTPS协议认证过程详解
什么是 HTTPS https不是一种新的协议,只是http的通信接口部分使用了ssl和tsl协议替代,加入了加密、证书、完整性保护的功能,下面解释一下加密和证书,如下图所示 SSL 证书的获取 假设有一个认证中心简称CA(Certificate Authority),这个认证中心 CA 给 A 网站颁发了一个证书,这个证书有: 签发者 证书用途 A 网站的公钥 A 网站的加密算法 A 网站用的HASH算法 证书的到期时间等 但是,如果证书就这样给 A 网站了,那传输过程中如
2021-01-19 14:27:54
3475
原创 HTTP协议解析
HTTP 请求报文格式 请求方法 请求方法 请求描述 GET 请求指定的页面信息,并返回实体主体。 POST 向指定的资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立或已有资源的修改。 PUT 从客户端向服务器传送的数据取代指定的文档的内容。 DELETE 请求服务器删除指定的页面。 OPTIONS 允许客户端查看服务器的性能。 PATCH 是对 PUT 方法的补充,用来对已知资源进行局部更新。(修改)
2021-01-19 14:26:15
467
原创 epoll原理及反应堆模型
前言 设想一个场景:有100万用户同时与一个进程保持着TCP连接,而每一时刻只有几十个或几百个TCP连接是活跃的(接收TCP包),也就是说在每一时刻进程只需要处理这100万连接中的一小部分连接。那么,如何才能高效的处理这种场景呢?进程是否在每次询问操作系统收集有事件发生的TCP连接时,把这100万个连接告诉操作系统,然后由操作系统找出其中有事件发生的几百个连接呢?实际上,在Linux2.4版本以前,那时的select或者poll事件驱动方式是这样做的。 这里有个非常明显的问题,即在某一时刻,进程收集有事件的
2020-12-06 23:34:17
212
原创 IO多路复用中 select、poll、epoll
IO多路复用中 select、poll、epoll 什么是IO多路复用? IO多路复用就是一种同步IO模型,实现一个线程可以监视多个文件句柄;一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;没有文件句柄就绪时会阻塞应用程序,交出cpu。多路是指网络连接,复用指的是同一个线程。 一般来说,我们通常是一个请求就是一个线程,这样会造成多个线程同时存在,会造成上下文的切换造成不必要的开销。IO多路复用是指一个线程来管理这一个个的请求。 文件句柄博客 实现原理 select 方法 原理 虚线上面
2020-12-06 22:09:44
462
原创 浅谈阻塞队列的原理
阻塞队列 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UmhzIyRO-1606749754423)(C:\Users\DELL\Ap
2020-11-30 23:24:20
692
原创 java的四种引用类型你知道吗?
前言 Java的内存回收不需要程序员负责,JVM会在必要时启动Java GC完成垃圾回收。 Java以便我们控制对象的生存周期,提供给了我们四种引用方式,引用强度从强到弱分别为:强引用、软引用、弱引用、虚引用。 JDK1.2以前只提供一种引用类型——强引用 Object obj = new Object();。而JDK1.2后我们多另外的三个选择分别是软引用 java.lang.ref.SoftReference、弱引用 java.lang.ref.WeakReference 和虚引用 java.lang
2020-11-22 11:22:41
213
原创 一文带你搞懂 ThreadLocal 的原理及使用
ThreadLocal 介绍 ThreadLocal的使用 常见 API 使用 ThreadLocal类与synchronized关键字的区别 ThreadLocal 使用案例 ThreadLocal的设计与源码解析 核心结构设计 ThreadLocalMap结构以及Hash冲突的解决方法 ThreadLocalMap结构 弱引用和内存泄漏 ThreadLocal 介绍 ThreadLocal 翻译过来是 本地线程,它的作用是为每一个线程创建一个副本,不同线程之间访问不..
2020-11-21 23:04:30
485
原创 八锁现象带你了解 synchronized 到底是锁什么?
什么是八锁现象? 八锁现象就是加锁的地方不一样,像加在普通方法,静态方法等,可以帮我们搞懂锁锁住的东西是什么。 第一种:标准情况下,两个线程先打印 发短信还是 打电话? //标准情况下,两个线程先打印 发短信还是 打电话? public class Test1 { public static void main(String[] args) { Phone phone = new Phone(); //锁的存在 new Thread(()-
2020-11-09 00:18:57
525
1
原创 一文带你玩转单例模式
单例模式 单例模式的特点 七种实现方法 破坏单例模式与解决方案 总结 单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实
2020-11-08 23:06:07
347
原创 java序列化,从底层到序列化所隐藏的问题以及解决方案
什么是序列化? 序列化:将对象写入到IO流中,对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。核心作用是对象状态的保存与重建。 反序列化:将IO流中恢复对象,客户端从文件中或网络上获得序列化后的对象字节流,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象。 序列化的意义 序列化机制允许将实现序列化的Java对象转换位字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以达到以后恢复成
2020-11-02 10:07:18
656
原创 Java泛型的原理和引发的问题你真的知道吗?
什么是泛型? JDK 1.5 的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。Java泛型被引入的好处是安全简单。 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。 泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动
2020-11-01 15:29:09
408
原创 你真的了解过 ConcurrentHashMap 吗?
首先,我们需要先了解一下 HashMap 和 HashTable。 HashMap :是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干。在方法中都没有加锁或相关的锁机制,所有线程是不安全的。 HashTable:和 HashMap 一样,只是它在方法上都加上了锁,保证了线程的安全,但是降低了速度。 由于 HashMap 速度快,但是保证不了线程安全,而 HashTable 可以保证线程安全,但
2020-10-23 23:18:51
882
原创 深拷贝&浅拷贝 & 它们的实现
深拷贝&浅拷贝 浅拷贝 对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得到的数据。 对于数据类型是引用数据类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。实际上两个对象的该成员变量都指向同一个实例。 深拷贝 对于深拷贝来说,不仅要复制对象的所有基本数据类型的成员变量值
2020-10-18 00:04:55
509
6
原创 通过AQS看ReentrantLock的原理和实现
通过AQS看ReentrantLock的原理和实现 什么是 AQS ? aqs全称为AbstractQueuedSynchronizer,AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。它提供了一个FIFO队列,可以看成是一个用来实现同步锁以及其他涉及到同步功能的核心组件,常见的有:ReentrantLock、CountDownLatch等。 AQS是一个抽象类,主要是通过继承的方式来使用,它本身没有实现任何的同步接口,仅仅是定义了同步状态的获取以及释放的方法来提供自定义的
2020-10-17 16:13:12
254
原创 浅谈 CAS 及其缺点和解决方案
什么是 CAS 机制? CAS 英文就是 compare and swap ,也就是比较并交换,首先它是一个原子操作,可以避免被其他线程打断。在Java并发中,我们最初接触的应该就是synchronized关键字了,但是synchronized属于重量级锁,很多时候会引起性能问题,虽然在新的JDK中对其已经进行了优化。volatile也是个不错的选择,但是volatile不能保证原子性,只能在某些场合下使用。那么问题来了,这个 CAS 机制是怎么在不加锁的情况下来保证共享资源的互斥呢? synchro
2020-10-14 23:36:27
2498
3
原创 JDK1.7 和 JDK1.8 中 HashMap 的不同你知道吗?
HashMap(哈希表) 底层数据结构 源码解析 常量分析 HashMap初始化 put方法解析 扩容机制 底层数据结构 HashMap 在 JDK 1.7 前是 数组+链表 的形式来存储,在 JDK 1.8 后是 数组+链表+红黑树 上图为数组+链表的数据模型,每一个Node都是一个 Node节点源码如下,每一个Node节点都是HashMap的一个存储单位,Node是HashMap的一个内部类,实现了Map.Entry接口,本质上就是一个键值对。 存储数据的源码如下:
2020-10-12 16:51:38
336
原创 JDK 1.8 新特新
JDK 1.8 新特性 函数式接口 定义:所谓的函数式接口,实际上就是接口里面只能有一个抽象方法的接口。Comparator接口、Runanle接口都是典型的函数式接口。 特点: 接口有且仅有一个抽象方法,如抽象方法compare 允许定义静态非抽象方法。 允许定义默认defalut非抽象方法(default方法也是java8才有的) 允许java.lang.Object中的public方法,如方法equals。 FunctionInterface注解不是必须的,如果一个接口符合"函数式接口"定义,那
2020-10-08 15:18:28
477
原创 SpringBoot 的基本使用
创建一个maven工程 探究Hello World 主程序类、主入口类 使用Spring Initializer快速创建SpringBoot项目 默认生成的SpringBoot项目 配置文件的编写 YAML 语法 值的写法 配置文件值注入 @PropertySource和@ImportResource 配置文件占位符 Profile 配置文件加载位置 外部配置加载顺序 web开发 自动配置原理 日志框架 SpringBoot 对前端的支持 SpringBoot对静态资源的映射规则 Spri.
2020-08-31 17:27:50
1700
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅