- 博客(31)
- 收藏
- 关注
原创 应用层
应用层运输层为应用程序提供端到端的会话,但不同的网络应用和应用进程之间,还需要不同的通信规则,因此在运输层之上还需要有应用层。比如浏览器这个应用程序需要 HTTP、HTTPS 协议,而 XShell 应用需要 SSH 协议常见的协议如下 :DNS域名系统 DNS 是互联网使用的命名系统,用来便于人们使用的机器名字转换成 IP 地址DNS 的互联网标准是 RFC 1034, 1035FTP文件传输协议 FTP 是互联网上使用的最广泛的文件传输协议TFTPTCP/IP协议
2020-08-03 17:27:54 406
原创 运输层
运输层从 IP 层来说,通信的两端是两台主机,而运输层通信的两端是应用程序,描述的是应用程序与应用程序的会话进程之间的通信从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层IP 数据报的首部明确地标志了这两台主机的 IP 地址。但真正进行通信的实体是在主机中的进程,是这台主机中的一个进程和另一台主机中的一个进程在交换数据(即通信)因此严格地讲,两台主机进行通信就是两台主机中的应用进程互相通信。IP 协议虽然能把分组送到目的主机,但
2020-08-03 17:25:37 476
原创 网络层
网络层网络层的主要作用是 : 实现主机到主机 (IP 到 IP) 的通信,描述的是主机与主机的通讯,网络层使用的中间设备叫路由器数据链路层的主要作用是在互连同一种数据链路的节点之间进行包传递, 而一旦跨越多种数据链路, 就需要借助网络层网络层可以跨越不同的数据链路, 即使是在不同的数据链路上也能实现两端节点之间的数据包传递网络层与数据链路层的关系举个例子, 当我们要到达某个目的地的时候, 提前制定一个行程表 (何时到哪一目了然) , 需要换乘多种方式, 于是需要购买机票, 火车票 , 当我们
2020-08-03 17:22:02 435
原创 OSI 七层模型
OSI 七层模型每个层既是服务者又是被服务者, 即为上一层服务, 又被下一层服务IEEE 负责数据链路层及其以下标准的指定IETF 负责网络层及其以上标准的指定TCP/IP 模型应用层 : 处理特定应用程序细节运输层 : 为两台主机上的应用程序提供端到端的通讯网络层 : 处理分组在网络中的活动, 例如分组选录链路层 : 处理与电缆 (或者其他任何传输媒介) 的物理接口细节应用程序通常是用户进程, 而下三层一般在 Kernel 中执行应用层关系应用程序的细节, 下三层处理通讯细节
2020-08-01 08:20:00 322
原创 (三) 并发容器之 ConcurrentHashMap
HashMap 是线程不安全的集合, 相信只要是参加过面试的同学都会被面试官怼一句 : HashMap 线程安全吗? 为什么?HashMap 的源码就不讲了, 直接看他的孙子 : ConcurrentHashMap (越年轻越厉害) 现在为你揭开 ConcurrentHashMap 的神秘面纱 (本章节参照的是 JDK 8 的源码, 不讨论 JDK 7 的实现)ConcurrentHashMapJDK8 的 ConcurrentHashMap放弃了分段锁, 并且添加了红黑树, 因为定位到节点需要进
2020-07-30 20:15:08 257
原创 (二) 并发容器之 CopyOnWriteArraySet
同样, 用 List 的并发容器,当然也存在 Set 的并发容器,J.U.C 包下同样存在 CopyOnWriteArraySetCopyOnWriteArraySetpublic class CopyOnWriteArraySet<E> extends AbstractSet<E> implements java.io.Serializable { // 该类的所有操作由 CopyOnWriteArrayList 完成 private final C
2020-07-30 15:48:11 194
原创 (一) 并发容器之 CopyOnWriteArrayList
总所周知, ArrayList 是线程不安全的, 而 Vector 的性能太弱了 (直接锁对象), 基本不会使用, JDK 1.5 在 J.U.C 包中提供了一个并发 List : CopyOnWriteArrarListArrayList, Vector, LinkedList 三者的区别ArrayList : 底层是 Object 数组, 使用线性存储方式特点: 插入慢, 查询快, 线程不安全Vector : 同 ArrayList 一样 继承了 AbstractList 实现了 List
2020-07-30 15:11:57 161
原创 (七) mybatis 源码之 终章 : 与 Spring 整合
几乎所有的框架都需要与 Spring 整合, Spring 也号称框架中的框架, 其拓展性就不用我说了, 直接看源码 (本章节采用的是 注解, 并非 xml 配置文件)搭建环境@Configuration@ComponentScan("com.gp.ibatis")@MapperScan("com.gp.ibatis.mapper")public class MapperScanDemo { private final Resource configResource = new Clas
2020-07-30 11:23:56 184
原创 (六) mybatis 源码之 四大对象与插件开发
拦截器 Interceptor在创建四大对象的时候, 都应用到了拦截器/* 以下四个方法都应用了拦截器, 实现 Interceptor 接口为 mybatis 进行拓展 */public ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) { ParameterHandler parameterHandler =
2020-07-29 20:20:28 186
原创 (五) mybatis 源码之 注解 SQL
注解型 SQL众所周知, mybatis 支持两种编写 SQL 的方式 : xml 配置文件和注解, 就像这样@Results(id = "stu", value = { @Result(id = true, column = "id", property = "id"), @Result(column = "name", property = "name"), @Result(column = "tel", property = "tel"), @Result(colu
2020-07-29 15:28:11 361
原创 (四) mybatis 源码之 SQL 执行
执行 SQL使用 SqlSession 提供的 API 也能执行 SQL 语句, 不过这种方使用的少, 还是习惯使用接口的方式直接调用 SqlSession 的 getMapper 方法就可以为接口实现代理, 所以方法执行前会被拦截, 交给 MapperProxy 拦截, 它实现了 InterceptorHandler 接口// 得到 MapperMethodInvoker 对象, 调用其 invoke 方法// 最后交给 MapperMethod 执行, 查看他的 executor 方法pub
2020-07-29 09:49:12 274
原创 (三) mybatis 源码之 SqlSession
SqlSessionSqlSession 用于与数据库进行一次会话, 需要从 SqlSessionFactory 中获取, 查看其 openSession 方法// 一路调用来到这个方法private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) { Transaction tx = null; try {
2020-07-29 08:48:45 102
原创 (二) mybatis 源码之 SqlSessionFactory
SqlSesseionFactory建造者模式, 最后调用的是 build 方法, 创建了一个 SqlSessionFactory 对象public SqlSessionFactory build(Reader reader, String environment, Properties properties) { try { // 解析全局配置文件, 保存到 document 对象中 XMLConfigBuilder parser = new XMLConfi
2020-07-28 20:56:53 182
原创 (一) mybatis 源码系列之 mybatis 架构
什么是 mybatis 就不必介绍了, 开始看源码, 再看源码之前,先来了解一下 mybatis 的整体架构mybatis 大概是源码之中最为简单的了 (代码量最小, 逻辑不复杂), 相对于 spring, tomcat 而言有点蛋疼的就是没有注释, 代码干净的一批, 接口中没有一丁点 javadoc 文档整体架构接口层接口层主要定义的是与数据库进行交互的方式。在 Mybatis中,交互分为两种方式Mybatis提供的API使用 Mybatis 提供的API进行操作,通过获取 SqlS
2020-07-28 20:27:38 132
原创 (九) Tomcat 源码系列之 终章:性能优化
Tomcat 的性能优化可以从两个方面去考虑,JVM 优化,Tomcat 配置优化, 没有实际的开发经验和调优经验谈这个也是瞎几把扯淡,由于笔者仍在上大学,这方面接触不深,就不误人子弟了,了解一下即可可参考 : Tomcat 性能优化配置优化在大多数情况下,默认的配置可以满足我们的需求,但遇到特殊情况,就要考虑配置最优的选项了。比如,服务器性能过强,默认配置不能发挥全部性能,这就有点浪费了。常用配置如下 :maxConnections : 最大连接数,当到达该值时,服务器接受但不会处理更多的请求,额
2020-07-24 15:21:36 181
原创 (八) Tomcat 源码系列之 配置和安全
Tomcat 服务器的配置主要集中于 tomcat/conf 下的 catalina.policy、catalina.properties、context.xml、server.xml、tomcat-users.xml、web.xml 文件。server.xmlserver.xml 是 Tomcat 服务器的核心配置文件,包含了 Tomcat 的 Servlet 容器(Catalina)的所有配置。由于配置的属性特别多,我们在这里主要讲解其中的一部分重要配置。Server<Server por
2020-07-22 17:51:48 174
原创 (七) Tomcat 源码系列之 Jsp 处理流程
接着昨天讲的, Tomcat 是如何响应的, 也就是如何请求转发和重定向的? 聊这个之前,先来看看 Tomcat 是如何处理 jsp 页面的?查看 /conf/web.xml 配置文件<web-app .... > <servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.Defau
2020-07-22 16:51:04 565
原创 (六) Tomcat 源码系列之 请求处理
前面已经详细介绍了 Tomcat 的线程模型, 那么对于一个请求, Tomcat 到底是如何处理的呢 ?Acceptor由 NioEndpoint 的内部类 Acceptor 监听连接// Acceptor 实现类 Runable 接口, 直接查看 run 方法int errorDelay = 0;// 一直循环, 直到收到 "shutdown" 命令while (running) { // 当 Endpoint 暂停时, 自旋 while (paused &&a
2020-07-21 20:04:38 298
原创 (五) Tomcat 源码系列之 URI 映射
在地址栏输入的 URI , Tomcat 是如何找到对应的 Servlet 或 jsp 呢 ?其实在启动 Tomcat 组件 MapperListener 的时候, 就将对应的映射关系放入了一个 Mapper 中, 它有这几个作用映射关系存储:存储所有的 Host,Context 及 Wrapper 的对应关系;映射关系初始化及变更:当新增一个组件或者移除一个组件时,Mapper 如何维护 URI 到 Wrapper 的映射关系;映射关系使用 :根据 URI,映射到具体的 Host,Context
2020-07-21 12:44:55 275
原创 (四) Tomcat 源码系列之 Tomcat 启动流程
一切的 Java 程序入口都是 main 方法, Tomcat 的启动类是哪个呢?直接启动 Tomcat, 使用 jps -l 命令 (Linux 也可以使用 ps -ef | grep java), 查看本机上所有正在运行的 Java 程序可以看到, Tomcat 的主启动类是 org.apache.catalina.startup.BootstrapBootStrap 主启动类...
2020-07-19 21:13:00 358
原创 (三) Tomcat 源码系列之 Tomcat 线程模型
Tomcat 支持的应用层协议 : HTTP/1.1, HTTPS, AJP, 共有三种连接器模式 : BIO, NIO, APR, 在默认的配置下,使用的是 NIO 模式对于一个请求, Linux 是这样处理的 :TCP 的三次握手建立连接,建立连接的过程中,Linux 内核维护了半连接队列 (syn队列) 以及完全连接队列 (accept队列)syn 队列 : 用来保存处于 SYN_SENT 和 SYN_RECV 状态的请求accept 队列 : 用来保存处于 ESTABL
2020-07-18 17:14:42 804
原创 (二) Tomcat 源码系列之 Tomcat 架构
Catalina 架构Tomcat 是一个由一系列可配置的组件构成的 Web 容器,而 Catalina 可以看做是一个 Tomcat 实例Tomcat 由以下几个部分组成 :在源码上也可证明这一点 :Tomcat 本质上就是一款 Servlet 容器, 因此 Catalina 才是 Tomcat 的核心 , 其他模块都是为 Catalina 提供支撑的。 比如 : 通过 Coyote 模块提供链接通信,Jasper 模块提供JSP 引擎,Naming 提供 JNDI 服务,Juli 提供日志服
2020-07-17 18:59:14 193
原创 (一) Tomcat 源码系列之网络 I/O 模型
今天开始学习 Tomcat 源码, 本系列采用的是 Tomcat 8.5.57 源码构建, 在学习 Tomcat 源码之前, 先来学习基础知识 : 网络 I/O 模型. I/O 模型简单的理解:就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能Java 共支持 3 种网络编程模型 /IO 模型:BIO、NIO、AIOBIOBlocking IO, 同步并阻塞 (传统阻塞型),一般搭配线程池来使用, 否则只有一条线程在工作! 其中 : ServerSocket::accept
2020-07-16 21:15:43 529
原创 JMM 与 线程
线程之间如何通信?通信是指线程之间以何种机制来交换信息。 线程之间的通信机制有两种: 共享内存 和 消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信。Java 采用的是共享内存模型, 线程之间的通信由 Java 内存模型控制 (后文简称 JMM)JMM (JSR 133)Java 内存模型是一种抽象的概念, 旨在屏蔽各个硬件和操作系统的内存访问差
2020-07-14 11:36:34 241
原创 老子打烂你的 “线程池“
讲线程池之前, 先来讲讲 Callable 和 阻塞队列为什么有了Runnable, 还要出现 Callable?在没有出现 Callable 之前, Java 线程都有一个缺陷 :在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。而自从Java 1.5开始,就提供了 Callable 和 Future,通过它们可以在任务执行完毕之后得到任务执行结果。Callable 与 Runnable 区别Callable
2020-07-13 17:43:57 255
原创 JUC 并发工具类
昨天讲了 ReentrantLock, 今天就来讲讲 CountDownLatch, CyclicBarrier, Semaphore, Exchanger 这几个玩意, 如果你清楚了 ReentrantLock 原理, 那么搞懂这些就像喝水一样简单CountDowLatch (倒计时器)允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。例如, 当一个线程完成 run 方法时, 调用一次 countDown() , 计数器减一, 当计数器值为 0 时, 才能执行 await() 方法
2020-07-13 12:05:29 159
原创 看了这篇 ReentrantLock, Doug Lea 都说服
JDK 1.5 是一个大版本更新, 这个版本引入了 枚举, 泛型, 注解 可变参数, 自动装箱, for-each循环, 还引入了基于老年代的垃圾回收器 CMS, 最重要的是引入了并发包 java.util.concurrent , 由著名的并发编程大师 Doug Lea 亲自操刀, 简化了 Java 开发人员在并发编程中需要考虑的种种事情今天, 就来带你瞅瞅 Doug Lea 是如何编写这么牛逼的代码的, 相信看完之后你会对这个人说一句 : 牛B先来看看这玩意与 synchronized 的区别,
2020-07-12 16:28:10 309
原创 ThreadLocal 到底是个啥?
/** * This class provides thread-local variables. These variables differ from * their normal counterparts in that each thread that accesses one (via its * {@code get} or {@code set} method) has its own, independently initialized * copy of the variable
2020-07-12 11:07:56 197
原创 CAS 到底是嘛玩意
什么是 CAS ?CAS: (Compare And Swap) 比较和交换, Java 就是通过 CAS 来实现原子操作的 !如何使用 CAS ?CAS 需要三个操作数, 分别是 : 内存地址, 旧的预期值, 准备设置的新值CAS执行时, 对于一个变量 V, 他的旧的预期值为 A, 将要修改的值为 B, 有且仅当 V 符合 A, 处理器才会将 A 换成 B, 否者操作失败.在 JDK 5之后, Java 类库才开始使用 CAS 操作, 该操作被封装在 sun.misc.Unsafe 类中,
2020-07-11 16:32:13 888
原创 不懂 volatile, 也敢来面试?
volatile 是 Java 的关键字, 用于修饰变量, 是 Java 提供的最轻量的同步机制, 它有两大作用, 一是保证变量的可见性, 二是禁止 JVM 指令重排在讲 volatile 之前, 我们需要了解一些 CPU 的有关知识CPU一个 CPU 有多个处理器 (多核 CPU) , 以下严格区分处理器和 CPU 的概念一个处理器主要由这些玩意组成 :逻辑运算单元 (ALU) : 用于进行各种算术逻辑运算(如与, 或, 非等), 算术运算(如加减乘除)寄存器 (Regi
2020-07-11 15:24:14 281
原创 你真的懂 synchronized 吗?
synchronized 的三种使用方式加在非 static 方法上 (锁的是 this 对象)加在 static 方法 上 (锁的是 Class 对象)代码块 (锁的是 括号 中的对象)在实现同步的时候, 大多数开发人员直接使用 synchronized 关键字, 那你真的了解 synchronized 底层原理吗?字节码层级synchronized被编译成 class 文件, 翻译成字节码指令有两个重要的指令 : monitorenter monitorexit , 可以返现
2020-07-10 15:40:46 1178 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人