Merge remote-tracking branch 'origin/master'

pull/48/head
AmyliaY 5 years ago
commit 8c91d70bf0

@ -1,4 +1,4 @@
## 线程池核心组件图解 ## 线程池核心组件图解
看源码之前,先了解一下该组件 最主要的几个 接口、抽象类和实现类的结构关系。 看源码之前,先了解一下该组件 最主要的几个 接口、抽象类和实现类的结构关系。
![avatar](/images/JDK1.8/线程池组件类图.png) ![avatar](/images/JDK1.8/线程池组件类图.png)

@ -1,4 +1,4 @@
作为工作中最重要、最常用的容器之一,当然还是要自己动手写一篇 HashMap 的源码解析来加深对其的印象咯,而且它的设计与实现 也有很多值得学习的地方。 作为工作中最重要、最常用的容器之一,当然还是要自己动手写一篇 HashMap 的源码解析来加深对其的印象咯,而且它的设计与实现 也有很多值得学习的地方。
## 源码赏析 ## 源码赏析
JDK1.8 的HashMap 底层使用的是 动态数组,数组中元素存放的是 链表或红黑树。核心源码如下。 JDK1.8 的HashMap 底层使用的是 动态数组,数组中元素存放的是 链表或红黑树。核心源码如下。

@ -1,4 +1,4 @@
## 类图结构 ## 类图结构
J.U.C 的锁组件中 类相对较少从JDK相应的包中也能看出来下图标记了其中最主要的几个接口和类也是本文要分析的重点。 J.U.C 的锁组件中 类相对较少从JDK相应的包中也能看出来下图标记了其中最主要的几个接口和类也是本文要分析的重点。
![avatar](/images/JDK1.8/JUC的locks包.png) ![avatar](/images/JDK1.8/JUC的locks包.png)

@ -1 +1 @@
努力编写中... 努力编写中...

@ -1,4 +1,4 @@
本来想看 ThreadLocal 的源码的,但发现其中最重要的 get/set 方法都是操纵的 Thread类 中的 threadLocals变量 (java.lang.ThreadLocal.ThreadLocalMap),索性先来看一下 Thread 的源码吧,可以留意一下其中与 ThreadLocal 相关的属性,这样下次阅读 ThreadLocal 的核心API时就能够轻易理解其原理咯。不多BB直接上硬菜。 本来想看 ThreadLocal 的源码的,但发现其中最重要的 get/set 方法都是操纵的 Thread类 中的 threadLocals变量 (java.lang.ThreadLocal.ThreadLocalMap),索性先来看一下 Thread 的源码吧,可以留意一下其中与 ThreadLocal 相关的属性,这样下次阅读 ThreadLocal 的核心API时就能够轻易理解其原理咯。不多BB直接上硬菜。
实现多线程从本质上都是由 Thread类 来完成的,其源码量很多,本次只看一些常见且重要的部分,源码和解析如下。 实现多线程从本质上都是由 Thread类 来完成的,其源码量很多,本次只看一些常见且重要的部分,源码和解析如下。
```java ```java

@ -1,4 +1,4 @@
前面我们分析了 Thread类的源码有了前面的铺垫通过源码 理解ThreadLocal的秘密就容易多了。 前面我们分析了 Thread类的源码有了前面的铺垫通过源码 理解ThreadLocal的秘密就容易多了。
ThreadLocal类 提供了 get/set线程局部变量的实现ThreadLocal成员变量与正常的成员变量不同每个线程都可以通过 ThreadLocal成员变量 get/set自己的专属值。ThreadLocal实例 通常是类中的私有静态变量常用于将状态与线程关联例如用户ID或事务ID。 ThreadLocal类 提供了 get/set线程局部变量的实现ThreadLocal成员变量与正常的成员变量不同每个线程都可以通过 ThreadLocal成员变量 get/set自己的专属值。ThreadLocal实例 通常是类中的私有静态变量常用于将状态与线程关联例如用户ID或事务ID。
```java ```java

@ -1,4 +1,4 @@
Spring、Netty、Mybatis 等框架的代码中大量运用了 Java 多线程编程技巧。并发编程处理的恰当与否,将直接影响架构的性能。本章通过对 这些框架源码 的分析,结合并发编程的常用技巧,来讲解多线程编程在这些主流框架中的应用。 Spring、Netty、Mybatis 等框架的代码中大量运用了 Java 多线程编程技巧。并发编程处理的恰当与否,将直接影响架构的性能。本章通过对 这些框架源码 的分析,结合并发编程的常用技巧,来讲解多线程编程在这些主流框架中的应用。
## Java内存模型 ## Java内存模型
JVM规范 定义了 Java内存模型 来屏蔽掉各种操作系统、虚拟机实现厂商和硬件的内存访问差异,以确保 Java 程序 在所有操作系统和平台上能够达到一致的内存访问效果。 JVM规范 定义了 Java内存模型 来屏蔽掉各种操作系统、虚拟机实现厂商和硬件的内存访问差异,以确保 Java 程序 在所有操作系统和平台上能够达到一致的内存访问效果。

@ -1,4 +1,4 @@
作为一名初入职场的开发者,最开始是在逛 B 站刷视频时看到的一个 Spring 源码阅读解析,当时作为一个只知道 SSH 和 CRUD 的 boy看完后心里就两个词儿“卧槽牛 B 啊!”而且在去年秋招面试阿里时几乎每次都会被面试官问道“有阅读过什么开源框架吗?”每次我都只能一脸便秘的“嗯…,呃…,啊…,木得…”。这在我心里埋下了一个想法,硬着头皮也要把 Spring 框架源码读一遍,再不济也要看看猪是怎么跑的。 作为一名初入职场的开发者,最开始是在逛 B 站刷视频时看到的一个 Spring 源码阅读解析,当时作为一个只知道 SSH 和 CRUD 的 boy看完后心里就两个词儿“卧槽牛 B 啊!”而且在去年秋招面试阿里时几乎每次都会被面试官问道“有阅读过什么开源框架吗?”每次我都只能一脸便秘的“嗯…,呃…,啊…,木得…”。这在我心里埋下了一个想法,硬着头皮也要把 Spring 框架源码读一遍,再不济也要看看猪是怎么跑的。
从 7 月份开始到现在,利用业余时间完成了 Spring 核心实现IoC、DI、AOP及重要组件实现MVC、事务、JDBC的源码阅读并输出相关博客 7 篇,在 Spring 源码上做的详细注解也维护到了个人 GitHub 上,并且将其整合到了开源学习社区 Doocs 上。 从 7 月份开始到现在,利用业余时间完成了 Spring 核心实现IoC、DI、AOP及重要组件实现MVC、事务、JDBC的源码阅读并输出相关博客 7 篇,在 Spring 源码上做的详细注解也维护到了个人 GitHub 上,并且将其整合到了开源学习社区 Doocs 上。

@ -1,4 +1,4 @@
本博文用于重点分析 Netty 的逻辑架构及关键的架构质量属性,希望有助于大家从 Netty 的架构设计中汲取营养,设计出高性能、高可靠 本博文用于重点分析 Netty 的逻辑架构及关键的架构质量属性,希望有助于大家从 Netty 的架构设计中汲取营养,设计出高性能、高可靠
性和可扩展的程序。 性和可扩展的程序。
## Netty的三层架构设计 ## Netty的三层架构设计

@ -1 +1 @@
努力编写中...... 努力编写中......

@ -1,4 +1,4 @@
作为一个高性能的 NIO通信框架Netty 被广泛应用于大数据处理、互联网消息中间件、游戏和金融行业等。大多数应用场景对底层的通信框架都有很高的性能要求,作为综合性能最高的 NIO框架 之一Netty 可以完全满足不同领域对高性能通信的需求。本章我们将从架构层对 Netty 的高性能设计和关键代码实现进行剖析,看 Netty 是如何支撑高性能网络通信的。 作为一个高性能的 NIO通信框架Netty 被广泛应用于大数据处理、互联网消息中间件、游戏和金融行业等。大多数应用场景对底层的通信框架都有很高的性能要求,作为综合性能最高的 NIO框架 之一Netty 可以完全满足不同领域对高性能通信的需求。本章我们将从架构层对 Netty 的高性能设计和关键代码实现进行剖析,看 Netty 是如何支撑高性能网络通信的。
## RPC 调用性能模型分析 ## RPC 调用性能模型分析
### 传统 RPC 调用性能差的原因 ### 传统 RPC 调用性能差的原因

@ -1,4 +1,4 @@
## Linux 网络 IO 模型简介 ## Linux 网络 IO 模型简介
Linux 的内核将所有外部设备都看做一个文件来操作对一个文件的读写操作会调用内核提供的系统命令返回一个fd (file descriptor文件描述符)。而对一个 socket 的读写也会有相应的描述符,称为 socket fd (socket 描述符),描述符就是一个数字,它指向内核中的一个结构体(文件路径,数据区等一些属性)。根据UNIX网络编程对 I/O模型 的分类UNIX 提供了5种 I/O模型分别如下。 Linux 的内核将所有外部设备都看做一个文件来操作对一个文件的读写操作会调用内核提供的系统命令返回一个fd (file descriptor文件描述符)。而对一个 socket 的读写也会有相应的描述符,称为 socket fd (socket 描述符),描述符就是一个数字,它指向内核中的一个结构体(文件路径,数据区等一些属性)。根据UNIX网络编程对 I/O模型 的分类UNIX 提供了5种 I/O模型分别如下。
#### 1、阻塞IO模型 #### 1、阻塞IO模型

@ -1,4 +1,4 @@
## 传统的BIO编程 ## 传统的BIO编程
网络编程的基本模型是 Client/Server 模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手建立连接,如果连接建立成功,双方就可以通过网络套接字(Socket) 进行通信。 网络编程的基本模型是 Client/Server 模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手建立连接,如果连接建立成功,双方就可以通过网络套接字(Socket) 进行通信。
在基于传统同步阻塞模型开发中ServerSocket 负责绑定IP 地址启动监听端口Socket负责发起连接操作。连接成功之后双方通过输入和输出流进行同步阻塞式通信。 在基于传统同步阻塞模型开发中ServerSocket 负责绑定IP 地址启动监听端口Socket负责发起连接操作。连接成功之后双方通过输入和输出流进行同步阻塞式通信。

@ -1,4 +1,4 @@
网上关于各种IO的博文已经多到飞起如果你是大神可以跳过我这个菜鸟的拙文本博文没有什么特别NB的东西只是集百家之长并且以自己感到简单舒适的方式输出自己的理解及学习过程中的经验。 网上关于各种IO的博文已经多到飞起如果你是大神可以跳过我这个菜鸟的拙文本博文没有什么特别NB的东西只是集百家之长并且以自己感到简单舒适的方式输出自己的理解及学习过程中的经验。
## IO及基本概念 ## IO及基本概念
#### 1、流的概念和作用 #### 1、流的概念和作用
**流**:代表任何有能力产出数据的数据源对象或者是有能力接受数据的接收端对象。<Thinking in Java> **流**:代表任何有能力产出数据的数据源对象或者是有能力接受数据的接收端对象。<Thinking in Java>

@ -1 +1 @@
努力编写中... 努力编写中...

@ -1 +1 @@
努力编写中... 努力编写中...

@ -1 +1 @@
努力编写中...... 努力编写中......

@ -1 +1 @@
努力编写中...... 努力编写中......

@ -1 +1 @@
努力编写中...... 努力编写中......

@ -1,4 +1,4 @@
## TCP粘包/拆包 ## TCP粘包/拆包
熟悉 TCP编程 的都知道,无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑 TCP底层 的 粘包/拆包机制。TCP粘包/拆包问题,在功能测试时往往不会怎么出现,而一旦并发压力上来,或者发送大报文之后,就很容易出现 粘包 / 拆包问题。如果代码没有考虑,往往就会出现解码错位或者错误,导致程序不能正常工作。本篇博文,我们先简单了解 TCP粘包/拆包 的基础知识,然后来看看 Netty 是如何解决这个问题的。 熟悉 TCP编程 的都知道,无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑 TCP底层 的 粘包/拆包机制。TCP粘包/拆包问题,在功能测试时往往不会怎么出现,而一旦并发压力上来,或者发送大报文之后,就很容易出现 粘包 / 拆包问题。如果代码没有考虑,往往就会出现解码错位或者错误,导致程序不能正常工作。本篇博文,我们先简单了解 TCP粘包/拆包 的基础知识,然后来看看 Netty 是如何解决这个问题的。
### TCP粘包/拆包问题说明 ### TCP粘包/拆包问题说明

@ -1,4 +1,4 @@
相对于服务端Netty客户端 的创建更加复杂,除了要考虑线程模型、异步连接、客户端连接超时等因素外,还需要对连接过程中的各种异常进行考虑。本章将对 Netty客户端 创建的关键流程和源码进行分析,以期读者能够了解客户端创建的细节。 相对于服务端Netty客户端 的创建更加复杂,除了要考虑线程模型、异步连接、客户端连接超时等因素外,还需要对连接过程中的各种异常进行考虑。本章将对 Netty客户端 创建的关键流程和源码进行分析,以期读者能够了解客户端创建的细节。
## 基于 Netty 创建客户端的流程分析 ## 基于 Netty 创建客户端的流程分析
Netty 为了向使用者屏蔽 NIO通信 的底层细节在和用户交互的边界做了封装目的就是为了减少用户开发工作量降低开发难度。Bootstrap 是 Socket 客户端创建工具类,用户通过 Bootstrap 可以方便地创建 Netty 的客户端并发起 异步TCP连接操作。 Netty 为了向使用者屏蔽 NIO通信 的底层细节在和用户交互的边界做了封装目的就是为了减少用户开发工作量降低开发难度。Bootstrap 是 Socket 客户端创建工具类,用户通过 Bootstrap 可以方便地创建 Netty 的客户端并发起 异步TCP连接操作。

@ -1,4 +1,4 @@
## Netty 服务端创建源码分析 ## Netty 服务端创建源码分析
当我们直接使用 JDK 的 NIO类库 开发基于 NIO 的异步服务端时,需要用到 多路复用器Selector、ServerSocketChannel、SocketChannel、ByteBuffer、SelectionKey 等,相比于传统的 BIO开发NIO 的开发要复杂很多开发出稳定、高性能的异步通信框架一直是个难题。Netty 为了向使用者屏蔽 NIO通信 的底层细节在和用户交互的边界做了封装目的就是为了减少用户开发工作量降低开发难度。ServerBootstrap 是 Socket服务端 的启动辅助类,用户通过 ServerBootstrap 可以方便地创建 Netty 的服务端。 当我们直接使用 JDK 的 NIO类库 开发基于 NIO 的异步服务端时,需要用到 多路复用器Selector、ServerSocketChannel、SocketChannel、ByteBuffer、SelectionKey 等,相比于传统的 BIO开发NIO 的开发要复杂很多开发出稳定、高性能的异步通信框架一直是个难题。Netty 为了向使用者屏蔽 NIO通信 的底层细节在和用户交互的边界做了封装目的就是为了减少用户开发工作量降低开发难度。ServerBootstrap 是 Socket服务端 的启动辅助类,用户通过 ServerBootstrap 可以方便地创建 Netty 的服务端。
### Netty 服务端创建时序图 ### Netty 服务端创建时序图

@ -1 +1 @@
努力编写中... 努力编写中...

@ -1,4 +1,4 @@
理论性的文字,我觉得就没必要再扯一遍咯,大道理讲这么多,越听越迷糊。不如直接看源码加注释来的明白痛快。所以话不多说,直接上源码。 理论性的文字,我觉得就没必要再扯一遍咯,大道理讲这么多,越听越迷糊。不如直接看源码加注释来的明白痛快。所以话不多说,直接上源码。
## 1 主要的接口 ## 1 主要的接口
### 1.1 Advice 通知 ### 1.1 Advice 通知

@ -1,4 +1,4 @@
## 前言 ## 前言
之前一直想系统的拜读一下 spring 的源码,看看它到底是如何吸引身边的大神们对它的设计赞不绝口,虽然每天工作很忙,每天下班后总感觉脑子内存溢出,想去放松一下,但总是以此为借口,恐怕会一直拖下去。所以每天下班虽然有些疲惫,但还是按住自己啃下这块硬骨头。 之前一直想系统的拜读一下 spring 的源码,看看它到底是如何吸引身边的大神们对它的设计赞不绝口,虽然每天工作很忙,每天下班后总感觉脑子内存溢出,想去放松一下,但总是以此为借口,恐怕会一直拖下去。所以每天下班虽然有些疲惫,但还是按住自己啃下这块硬骨头。
spring 源码这种东西真的是一回生二回熟第一遍会被各种设计模式和繁杂的方法调用搞得晕头转向不知道看到的这些方法调用的是哪个父类的实现IoC相关的类图实在太复杂咯继承体系又深又广但当你耐下心来多走几遍会发现越看越熟练每次都能 get 到新的点。 spring 源码这种东西真的是一回生二回熟第一遍会被各种设计模式和繁杂的方法调用搞得晕头转向不知道看到的这些方法调用的是哪个父类的实现IoC相关的类图实在太复杂咯继承体系又深又广但当你耐下心来多走几遍会发现越看越熟练每次都能 get 到新的点。

@ -1,4 +1,4 @@
## 前言 ## 前言
接着上一篇的 BeanDefinition 资源定位开始讲。Spring IoC 容器 BeanDefinition 解析过程就是把用户在配置文件中配置的 bean解析并封装成 IoC 容器可以装载的 BeanDefinition 对象BeanDefinition 是 Spring 定义的基本数据结构,其中的属性与配置文件中 bean 的属性相对应。 接着上一篇的 BeanDefinition 资源定位开始讲。Spring IoC 容器 BeanDefinition 解析过程就是把用户在配置文件中配置的 bean解析并封装成 IoC 容器可以装载的 BeanDefinition 对象BeanDefinition 是 Spring 定义的基本数据结构,其中的属性与配置文件中 bean 的属性相对应。
PS可以结合我 GitHub 上对 Spring 框架源码的阅读及个人理解一起看,会更有助于各位开发大佬理解。地址如下。 PS可以结合我 GitHub 上对 Spring 框架源码的阅读及个人理解一起看,会更有助于各位开发大佬理解。地址如下。

@ -1,4 +1,4 @@
## 前言 ## 前言
前面我们主要分析了 FileSystemXmlApplicationContext 这个具体的 IoC容器实现类 的初始化源码,在 IoC容器 中建立了 beanName 到 BeanDefinition 的数据映射,通过一个 ConcurrentHashMap。现在我们来看一下 Spring 是如何将 IoC 容器中存在依赖关系的 bean 根据配置联系在一起的。 前面我们主要分析了 FileSystemXmlApplicationContext 这个具体的 IoC容器实现类 的初始化源码,在 IoC容器 中建立了 beanName 到 BeanDefinition 的数据映射,通过一个 ConcurrentHashMap。现在我们来看一下 Spring 是如何将 IoC 容器中存在依赖关系的 bean 根据配置联系在一起的。
Spring 中触发 IoC容器“依赖注入” 的方式有两种,一个是应用程序通过 getBean()方法 向容器索要 bean实例 时触发依赖注入;另一个是提前给 bean 配置了 lazy-init 属性为 falseSpring 在 IoC容器 初始化会自动调用此 bean 的 getBean() 方法,提前完成依赖注入。总的来说,想提高运行时获取 bean 的效率,可以考虑配置此属性。 Spring 中触发 IoC容器“依赖注入” 的方式有两种,一个是应用程序通过 getBean()方法 向容器索要 bean实例 时触发依赖注入;另一个是提前给 bean 配置了 lazy-init 属性为 falseSpring 在 IoC容器 初始化会自动调用此 bean 的 getBean() 方法,提前完成依赖注入。总的来说,想提高运行时获取 bean 的效率,可以考虑配置此属性。

@ -1,4 +1,4 @@
引言:庞大的代码量让人心生怠倦,有趣的故事让技术也疯狂。 引言:庞大的代码量让人心生怠倦,有趣的故事让技术也疯狂。
大家好,我是 IoC 容器家族的第 17 代传人,我们家族世世代代在 spring 商业街上卖烤面筋大家都叫我“面筋哥”另外我爹还给我起了个高大上的英文名字叫“FileSystemXmlApplicationContext”但有群臭猴子嫌麻烦就天天叫我的外号害得我差点忘了自己的本名。不过无所谓咯只要生意兴隆这都是小事。 大家好,我是 IoC 容器家族的第 17 代传人,我们家族世世代代在 spring 商业街上卖烤面筋大家都叫我“面筋哥”另外我爹还给我起了个高大上的英文名字叫“FileSystemXmlApplicationContext”但有群臭猴子嫌麻烦就天天叫我的外号害得我差点忘了自己的本名。不过无所谓咯只要生意兴隆这都是小事。

@ -1,4 +1,4 @@
## Servlet 基础 ## Servlet 基础
### Servlet 简介 ### Servlet 简介
ServletServer Applet是J2EE的内容之一由 Java 编写的服务器端小程序。它是web请求的入口主要功能在于交互式地Request 和 Response浏览和修改数据生成动态 Web内容。Servlet 运行于支持 Java的应用服务器中如 Tomcat。从实现上讲Servlet 可以响应任何类型的请求,但绝大多数情况下 Servlet 只用来扩展基于 HTTP协议 的 Web服务器。servlet 的工作模式如下: ServletServer Applet是J2EE的内容之一由 Java 编写的服务器端小程序。它是web请求的入口主要功能在于交互式地Request 和 Response浏览和修改数据生成动态 Web内容。Servlet 运行于支持 Java的应用服务器中如 Tomcat。从实现上讲Servlet 可以响应任何类型的请求,但绝大多数情况下 Servlet 只用来扩展基于 HTTP协议 的 Web服务器。servlet 的工作模式如下:
- 客户端发送请求至 WEB服务器 - 客户端发送请求至 WEB服务器

@ -1 +1 @@
努力编写中... 努力编写中...

@ -1 +1 @@
努力编写中... 努力编写中...

@ -1 +1 @@
努力编写中... 努力编写中...
Loading…
Cancel
Save