祖母绿宝石
程序员
展开
-
Java并发_第三篇:锁的由来,并发三特性全解析
文章目录一、前言二、三大源头2.1 缓存导致可见性问题2.1.1 理论:从单核CPU到多核CPU2.1.2 实践:多线程可见性问题2.2 线程切换带来的原子性问题2.3 编译优化带来的有序性问题2.3.1 第一,经典案例:双重检查创建单例对象2.3.2 第二,我们认为的new操作:instance = new Singleton();2.3.3 第三,实际优化后的执行路径:instance = new Singleton();三、Java中如何解决可见性和有序性问题?(JMM:Java内存模型)3.1 可见原创 2020-11-21 10:35:11 · 832 阅读 · 1 评论 -
Java并发_第四篇:synchronized,并发安全的守护神
文章目录一、前言二、synchronized的使用2.1 synchronized五种情况2.2 synchronized五种情况的使用2.2.1 synchronized五种情况的使用2.2.2 第一种情况和第三种情况2.2.3 第二种情况和第四种情况三、synchronized源码解析3.1 对象头 + Mark Word3.1.1 同步锁对象的对象头(对象头=Mark Word + Class Metadata Address + Array length,三个每一个占一个字宽)3.1.2 对象头的M原创 2020-11-22 14:17:58 · 674 阅读 · 2 评论 -
Netty重点原理概要(原理类)
文章目录干货1:从Linux五种IO到Netty?(刚开始,一定要从底层源头上说,拉高逼格)干货2:从Socket网络编程到Netty?(刚开始,一定要从底层源头上说,拉高逼格)2、为什么要用 Netty?1、Netty 是什么?2、为什么要用 Netty?3、Netty 应用场景了解么?4、Netty 核心组件有哪些?分别有什么作用?5、EventloopGroup 了解么?和 EventLoop 啥关系?6、Bootstrap 和 ServerBootstrap 了解么?7、NioEven原创 2020-08-19 22:55:03 · 691 阅读 · 0 评论 -
Netty源码_01_Netty服务端初始化
文章目录一、前言二、demo:服务端启动2.1 demo2.1 demo中的每一行代码三、Netty源码解析:服务端初始化3.1 bind()方法:initAndRegister() + doBind0()3.2 初始化和注册:initAndRegister()3.2.1 initAndRegister()方法:newChannel() + init(channel)3.3.2 initAndRegister()第一步:newChannel()工厂模式新建一个channel3.3.2.1 新建一个Refle原创 2020-08-23 21:21:35 · 1816 阅读 · 0 评论 -
Netty源码_02_Netty中的Reactor源码解析
netty最核心的就是reactor线程,对应项目中使用广泛的NioEventLoop,那么NioEventLoop里面到底在干些什么事?netty是如何保证事件循环的高效轮询和任务的及时执行?又是如何来优雅地fix掉jdk的nio bug?带着这些疑问,本篇文章将庖丁解牛,带你逐步了解netty reactor线程的真相[源码基于4.1.6.Final]reactor 线程的启动NioEventLoop的run方法是reactor线程的主体,在第一次添加任务的时候被启动NioEventLoop 父原创 2020-08-23 15:26:20 · 1386 阅读 · 0 评论 -
Netty源码_03_Pipleline组件源码解析(一)
文章目录一、前言二、pipeline 初始化三、pipeline添加节点DefaultChannelPipeline类中的addLast()方法源码解析:Netty添加节点的时候,从源码层面区分一个 ChannelHandlerContext到底是in还是out3.1 checkMultiplicity()源码解析:检查是否有重复handler,先校验3.2 newContext()源码解析:创建节点3.2.1 前奏:filterName()处理名称3.2.2 newContext()创建context3.原创 2020-08-24 20:48:12 · 1188 阅读 · 0 评论 -
Netty源码_04_Pipleline组件源码解析(二)
文章目录一、前言二、Unsafe到底是干什么的2.1 初识Unsafe2.2 Unsafe整个继承结构(7个类)2.2.1 UnSafe接口(重点)2.2.2 NioUnSafe接口-略2.2.3 AbstractUnsafe类-略2.2.4 AbstractNioUnsafe类-略2.2.5 NioSocketChannelUnsafe类和NioByteUnsafe类-重点2.3 Unsafe的分类2.3.1 NioByteUnsafe中的读:委托到外部类NioSocketChannel2.3.2 Nio原创 2020-08-25 15:22:19 · 697 阅读 · 0 评论 -
Netty源码_05_新连接接入源码解析
文章目录一、前言二、基本概念2.1 netty中的reactor线程(金手指)2.2 服务端启动三、问题1:Netty如何处理新连接的建立?3.1 检测到有新连接进入3.2 注册到reactor线程3.2.1 doReadMessages(List) 读缓存读入逻辑3.2.2 pipeline.fireChannelRead(NioSocketChannel) pipeline读入逻辑小结一、前言相关问题1:netty如何接受新的请求?相关问题2:netty如何给新请求分配reactor线程?相原创 2020-08-24 14:04:38 · 452 阅读 · 0 评论 -
Netty_01_分布式架构中的网络通信
8.1.1. Netty 原理Netty 是一个高性能、异步事件驱动的 NIO 框架,基于 JAVA NIO 提供的 API 实现。它提供了对TCP、UDP 和文件传输的支持,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞的,通过 Future-Listener 机制,用户可以方便的主动获取或者通过通知机制获得 IO 操作结果。8.1.2. Netty 高性能...原创 2020-04-05 17:25:55 · 2762 阅读 · 1 评论 -
Netty_02_高性能的NIO框架
Nettynetty就是背好八股文就好了Netty和NIO的api对应TransportChannel ----对应NIO中的channelEventLoop---- 对应于NIO中的while循环EventLoopGroup: 多个EventLoop,就是事件循环ChannelHandler和ChannelPipeline—对应于NIO中的客户逻辑实现handleRead/handleWrite(intercept.原创 2022-12-10 15:26:29 · 531 阅读 · 0 评论 -
Netty_03_ByteBuf和网络中拆包粘包问题及其解决
Netty原创 2022-12-10 20:24:24 · 1373 阅读 · 0 评论 -
Netty_04_消息协议设计与实战(实践类)
Netty自定义消息格式原创 2022-12-10 23:01:22 · 351 阅读 · 0 评论 -
Netty_05_六种序列化方式(JavaIO序列化 XML序列化 Hessian序列化 JSON序列化 Protobuf序列化 AVRO序列化)(实践类)
各种各种的序列化方式原创 2022-12-10 09:44:36 · 781 阅读 · 0 评论 -
Netty_06_手写RPC基础版(实践类)
netty实现rpc(基础版)原创 2022-12-11 10:59:18 · 419 阅读 · 0 评论 -
JVM_第一篇:JVM引用四兄弟
文章目录一、前言二、强引用三、软引用四、弱引用五、虚引用六、面试金手指(背下来)谈一谈你对Java中四种引用类型的理解?七、小结一、前言Java两种数据类型:8种值类型和3种引用类型(类、接口、数组),不管哪种引用类型,都要有相应的引用。在Java中提供了四个级别的引用:强引用,软引用,弱引用和虚引用。在这四个引用类型中,只有强引用FinalReference类是包内可见,其他三种引用类型均为public,可以在应用程序中直接使用。引用类型的类结构如图所示。金手指1:四种引用类型都是继承原创 2020-08-05 17:17:52 · 692 阅读 · 2 评论 -
JVM_第二篇:虚拟机内存结构以及虚拟机中销毁和新建对象
文章目录一、JVM的内存结构(JVM第一篇博客有,这里不再总结)问题:JVM中对象、引用和变量存储JVM内存结构:运行时数据区域第一,程序计数器(普通方法和native方法 + 帧栈 + 当前帧栈 + 帧栈四个部分)问题:运行时数据区域的程序计数器 和 计算机组成原理的PC寄存器?(帧栈和当前帧栈)第二,Java 虚拟机栈(记住三点:属于线程 + 方法调用压栈出栈 + 栈溢出和内存泄露)第三,本地方法栈第四,堆(记住两个,堆共享 + 堆GC操作)第五,方法区(记住四点:方法区存放相对静止数据但是不使用永久、原创 2021-05-03 14:46:16 · 509 阅读 · 0 评论 -
JVM_第三篇:各种数据类型的常量池技术
文章目录一、概述二、代码2.1 基本类型常量池2.1.1 Boolean常量池2.1.1.1 代码1——常量池比较 true2.1.1.2 代码2——新建对象比较 一定返回false2.1.1.3 代码3——基本类型比较(true 栈内存中,数值相等即为true,与常量池无关)2.1.2 字符型(Character)常量池2.1.2.1 代码1——常量池比较(涉及常量池:Character在(0 ~ 127)使用常量池技术,返回为true,范围外在堆中新建对象,返回为false)2.1.2.2 代码2——原创 2020-10-21 20:29:42 · 658 阅读 · 1 评论 -
JVM_第四篇:由浅入深,虚拟机常量池底层解析
文章目录一、前言二、String 类和常量池问题一:问题二:问题三:问题四:问题五:问题六:问题七:问题八:三、8种基本类型的包装类和常量池四、一、前言二、String 类和常量池黄金三句:1、直接使用双引号声明出来的 String 对象会直接存储在常量池中。如果不是用双引号声明的 String 对象,可以使用 String 提供的 intern 方法。2、相同内容的字符串,在常量池中永远只会保留一份;但是,相同内容的字符串,在堆中可以保留多份。这就是String的常量池技术。3、str2原创 2020-10-01 14:57:15 · 649 阅读 · 0 评论 -
JVM_第五篇:初识JVM,JVM自动内存管理
@[TOC]一、前言对于Java虚拟机在内存分配与回收的学习,如果读者大学时代没有偷懒的话,操作系统和计算机组成原理这两门功课学的比较好的话,理解起来JVM是比较容易的,只要底子还在,很多东西都可以触类旁通。1.1 计算机==>操作系统==>JVMJVM全称为Java Virtual Machine,译为Java虚拟机,读者会问,虚拟机虚拟的是谁呢?即虚拟是对什么东西的虚拟,即实体是什么,是如何虚拟的?下面让我们来看看“虚拟与实体”。关于计算机、操作系统、JVM三者关系,如下图:原创 2021-06-26 10:04:37 · 2595 阅读 · 20 评论 -
JVM_第六篇:JVM执行子系统,一点一滴解析.class文件
文章目录一、前言二、类文件结构2.1 平台无关性与语言无关性2.2 阅读.class文件三、类加载机制3.1 类加载概要3.2 类加载详细3.2.1 加载3.2.2 验证3.2.3 准备3.2.4 解析3.2.5 初始化3.3 类加载器3.3.1 类与类加载器3.3.2 双亲委派模型3.3.3 破坏双亲委派模型四、字节码执行引擎4.1 执行引擎4.1.1 执行引擎4.1.2 JVM执行引擎概念模型4.2 运行时帧栈结构4.2.1 引入帧栈4.2.2 帧栈的结构4.2.3 局部变量表Local Variabl原创 2021-10-31 11:46:07 · 1456 阅读 · 0 评论 -
JVM_第七篇:双管齐下,JVM内部优化与JVM性能调优
文章目录一、前言二、编译时优化2.1 Javac编译器2.2 Java语法糖2.2.1 泛型和泛型擦除2.2.2 自动装箱、自动拆箱、遍历循环2.2.3 条件编译三、运行时优化(核心:JIT编译器/即时编译器)3.1 HotSpot虚拟机内的JIT编译器3.1.1 编译器和解释器并存的架构3.1.2 编译对象和触发条件3.1.3 不同的编译过程3.2 编译优化技术3.2.1 公共子表达式消除(局部公共子表达式消除+全局公共子表达式消除)3.2.2 数组范围检查消除3.2.3 方法内联3.2.4 逃逸分析(原创 2021-07-04 21:16:42 · 3134 阅读 · 24 评论 -
JVM_第八篇:JMM,从虚拟机的角度来解释并发
文章目录一、前言二、Java内存模型2.1 引子:Java内存模型2.2 主内存与工作内存2.3 主内存和工作内存数据交互(原子性:八种原子性操作和八条原则)2.3.1 八种原子性操作2.3.2 八条规则2.3.3 分解Java程序练习2.3.4 long double型变量的特殊规则2.4 原子性、可见性与有序性2.5 有序性:先行发生原则2.5.1 有序性:八条先行发生原则2.5.2 时间上先发生与先行发生三、Java线程——将宏观代码与底层原理对比着来看3.1 Java线程的底层实现原理3.1.1 内原创 2021-07-05 20:12:01 · 1243 阅读 · 16 评论 -
JVM_第九篇:永久代退出舞台,元空间腾空出世
文章目录一、前言二、元空间由来和本质2.1 元空间(Metaspace)的诞生与 永久代的消失2.1.1 元空间诞生,使用本地内存2.1.2 永久代消失,使用参数指定大小2.2 从永久代到元空间2.2.1 jdk8之前,永生代在哪里?2.2.2 jdk8之后,永生代废弃,元数据空间出现2.3 Metaspace详情2.3.1 Metaspace 内存分配模型2.3.2 Metaspace 容量2.3.3 Metaspace 垃圾回收2.3.4 Java 堆内存的影响2.3.5 Metaspace 监控2.4原创 2020-09-23 19:37:54 · 522 阅读 · 0 评论 -
JVM_第十篇:呜,双亲委派模式伤心史
文章目录一、前言二、双亲委派模式2.1 双亲委派模式的结构2.2 先加载父类,再加载子类2.3 不可以跨模块加载2.4 小结三、JDBC的SPI机制违背双亲委派模式3.1 为什么说JDBC破坏了双亲委派模式3.2 JDBC是如何破坏JVM的双亲委派模式的3.3 JDBC是如何使用SPI机制的3.4 源码解析JavaSE中 java.sql.getConnection() 对SPI的支持3.5 JDBC通过Thread.currentThread().getContextClassLoader()得到线程上下原创 2020-12-13 11:37:45 · 463 阅读 · 2 评论 -
Windows_01_Windows系统的中的32位和64位(System32和SysWOW64)
Windows系统的中的32位和64位(System32和SysWOW64)原创 2022-10-23 16:36:08 · 5079 阅读 · 0 评论 -
JavaSE_第一篇:Java中一切都是对象
解释一下Java万物皆对象?Java中万物皆对象,表示一切类继承于Object类。jdk和jre区别?jdk是Java开发工具,jre是Java运行环境;Java开发需要jdk,Java运行需要jre。Java IO的底层实现(BIO NIO AIO)?Java中提供的IO有关的API,在文件处理的时候,其实依赖操作系统层面的IO操作实现的。...原创 2020-05-27 11:01:28 · 1355 阅读 · 0 评论 -
JavaSE_第二篇:一文搞懂成员变量初始化
文章目录一、前言二、局部变量和类变量的不同处理三、初始化顺序3.1 非静态域与方法(标准答案:非静态域>main方法函数调用)3.2 非静态域、代码块与方法(标准答案:非静态域、非静态代码段>main方法函数调用)3.3 静态域、静态代码块、非静态域、非静态代码块与方法(标准答案:静态域、静态代码块>非静态域、非静态代码块>main方法函数调用)3.4 父类static成员、子类static成员、父类非static成员、子类非static成员(父类静态域、父类静态代码块>子类静原创 2020-10-20 16:00:40 · 748 阅读 · 0 评论 -
JavaSE_第三篇:Father son=new Son()
文章目录一、概述二、代码分析2.1 仅父类2.2 继承 【Son son=new Son()】2.3 多态 【Father son=new Son()】三、面试金手指四、尾声一、概述多态是同一个行为具有多个不同表现形式或形态的能力。Java中多态即动态绑定、后期绑定或运行时绑定,是指对象的类型在运行时确定而不是在编译时确定。二、代码分析2.1 仅父类代码示意:public class Test { public static void main(String[] args原创 2020-12-05 14:04:42 · 1435 阅读 · 1 评论 -
JavaSE_第四篇:Java只有值传递
文章目录一、前言二、代码2.1 函数参数为基本类型(值传递)2.2 函数参数为引用类型(还是值传递)2.2.1 引用传递??2.2.2 引用是另一种形式的值2.2.3 当引用是集合框架的引用时...三、尾声一、前言高级语言中函数的参数传递方式只有三种,传值(按值传递),传引用(按引用传递),传地址(按地址传递)。java只有值传递没有引用传递。记住,有的博客中说java引用类型是引用传递,这种说法从语法上严格来说是错误的,有引用和有引用传递是两个概念。对于高级语言的参数传递一定要从内存模型开始,Jav原创 2020-12-05 14:19:48 · 590 阅读 · 1 评论 -
JavaSE_第五篇:懒汉式单例中为什么要使用双重检测
文章目录一、前言二、从懒汉式单例开始三、双层检测的局限性一、前言二、从懒汉式单例开始单例模式在多线程环境下的lazy模式为什么要加两个if(instance==null)?金手指:第一层 if (instance == null)是为了减少线程对同步锁锁的竞争,第二层if(instance==nul)是保证单例(1)只有第二层 if (instance == null) 的懒汉式多线程下是不安全的;(2)synchronized/lock + if (instance == null) 的懒原创 2020-08-01 21:53:11 · 2831 阅读 · 1 评论 -
JavaSE_第六篇:基本类型与引用类型
文章目录一、概述二、基本类型与引用类型2.1 基本类型2.2 引用类型2.2.1 三种引用类型2.2.2 enum枚举(特殊的类类型)2.2.3 String(特殊的引用类型)三、尾声一、概述Java中包括8种基本类型(9种包装类型,加一种Void)和3种引用类型(类、接口、数组,String是特殊的引用类型,enum枚举是特殊的类类型)二、基本类型与引用类型2.1 基本类型基本类型对应的包装类型(引用类型)字节数数值范围默认值booleanBoolean------原创 2020-12-06 10:10:53 · 986 阅读 · 1 评论 -
JavaSE_第七篇:JSON解析永不眠
{ "request":"login", "data": { "username":"zhangsan", "password":"123", "client":"iphone", "other":"" }}上面是JSON数据的格式,大家有没有发现,其实JSON数据就是一个map,为什么JSON可以用来不同语言的通信呢?是因为在不同的语言当中,都可以将JSON数据转换成JSON对象,大家应该理解什么是对象吧。转成对象之后,那么想要获取值原创 2020-07-20 13:43:55 · 726 阅读 · 1 评论 -
JavaSE_第八篇:注解,So easy
文章目录注解的概念注解的语法与定义形式注解的分类第一种分法第二种分法元注解注解的概念注解(Annotation),也叫元数据(Metadata),是Java5的新特性,JDK5引入了Metadata很容易的就能够调用Annotations。注解与类、接口、枚举在同一个层次,并可以应用于包、类型、构造方法、方法、成员变量、参数、本地变量的声明中,用来对这些元素进行说明注释。注解的语法与定义形式(1)以@interface关键字定义(2)注解包含成员,成员以无参数的方法的形式被声明。其方法名和返回值定原创 2020-07-23 23:52:41 · 557 阅读 · 0 评论 -
JavaSE_第九篇:枚举,接口常量的接棒员
文章目录从接口常量到枚举声明枚举例1 枚举与switch例2 values()例3 valueOf()例4 ordinal()例5 枚举中添加一个day属性-setter-getter-构造函数-toString()例6 枚举中添加String和int属性EnumMap 与 EnumSetEnumMap 类EnumSet 类从接口常量到枚举枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。枚举在曰常生活中很常见,例如一个人的性别只能是“男”或者“女”,一周的星期只能是 7 天中的一个等。原创 2020-07-09 15:08:47 · 475 阅读 · 0 评论 -
JavaSE_第十篇:反射,从字节码到对象
文章目录一、前言二、字节码对象2.1 Java反射机制中获取字节码对象2.2 Java虚拟机中对于某一个类只保留一份字节码对象2.3 小结三、使用字节码对象获取构造器进而新建对象3.1 从字节码对象到构造器3.2 使用字节码对象获取构造器3.3 使用获取到的构造器新建对象3.4 小结四、使用字节码对象获取方法进而调用方法4.1 从字节码对象到方法调用4.2 字节码对象获取方法并调用,无返回值,返回值为void4.3 字节码对象获取方法并调用,有返回值,返回值为String4.4 字节码对象获取static方原创 2020-12-06 16:03:10 · 532 阅读 · 1 评论 -
JavaSE_第十一篇:一文解析Java常用关键字
文章目录一、前言二、Java 51个关键字三、static关键字四、关键字extends和implements1、类继承类(单继承)2、类实现接口(多实现)3、接口继承接口(多继承)五、关键字this与super一、前言二、Java 51个关键字三、static关键字static是java中的一个关键字(key words),其表示的含义在于被static修饰的域、方法、代码块为类所有,而不是为代码所有,使用类名调用(亦可使用对象名调用),static域加载时仅加载一次。第一点,非static方法原创 2020-08-13 22:44:00 · 565 阅读 · 0 评论 -
JavaSE_第十二篇:对象传输,序列化和反序列化
一、基本概念1、序列化和反序列化的定义:(1)Java序列化就是指把Java对象转换为字节序列的过程 Java反序列化就是指把字节序列恢复为Java对象的过程。(2)序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。Javaweb开发,后端代码中,只要是需要前后端交互网络传输的Java实体类Bean,一般都是实现序列化接口Serializable;Java开发中,只要需要存储到磁盘文件的Java实体类Bean,也原创 2020-05-27 10:37:59 · 1003 阅读 · 0 评论 -
JavaSE_第十三篇:四种的序列化方式(JavaIO序列化 XML序列化 Hessian序列化 Protobuf序列化)
文章目录一、前言二、JavaBean的序列化和反序列化2.2 序列化封装为工具方法2.3 显示定义SerializableID属性三、各种序列化方式3.1 Utils_JavaSerialize,使用输入输出流实现序列化反序列化3.2 XML序列化XML序列化评价3.3 Hessian序列化Hessian序列化评价四、终结者——ProtoBuf序列化4.1 ProtoBuf写法4.2 Protobuf原理五、小结一、前言二、JavaBean的序列化和反序列化新建两个maven工程 server c原创 2020-06-21 17:31:01 · 731 阅读 · 1 评论 -
JavaSE_第十四篇:手写RPC,深入底层理解整个RPC通信
文章目录一、前言二、服务端与客户端连接2.1 构建工程结构2.2 rpcServerApi被rpcServerProvider 和 rpcClient 引用2.3 服务端和客户端通信2.3.1 rpcServerApi 提供接口2.3.2 rpcServerProvider2.3.3 rpcClient2.4 服务端与客户端交互成功三、进一步数据传送3.1 服务端 rpcServerProvider3.2 客户端rpcClient四、多线程、传送数据Bean的序列化和反序列化4.1 服务端 rpcServe原创 2020-05-31 20:36:46 · 1118 阅读 · 1 评论 -
JavaSE_第十五篇:网络编程,模拟TCP和模拟UDP
文章目录一、前言二、代码2.1 代码1——模拟TCP通信2.2 代码2——模拟UDP通信三、尾声一、前言Java的网络编程(java.net包)提供和计算机网络操作相关的API,本文演示Java代码模拟tcp通信和udp通信,且见代码1、代码2。模拟TCP:使用serversocket和socket;模拟UDP:使用DatagramSocket。二、代码2.1 代码1——模拟TCP通信package mypackageTCP; import java.io.PrintStream;imp原创 2020-12-11 21:07:06 · 1064 阅读 · 1 评论