使用Java NIO实现一个HTTP服务器

引言一直以来都想写一个自己的http服务器,这次趁着稍微空闲了一些,赶紧码了一个mini版的。在这里跟大家分享一下编写的整个思路,总体来说,整个应用非常简单,目前也只是实现了最基本的静态资源访问,但对于想学习Http协议的同学来说,应该还是有所帮助 HTTP协议先简单介绍一下HTTP协议,HTTP协议是构建于TCP/IP协议之上的一个应用层协议,并且是无连接无状态的。 http请求报文http的请求报文由三部分组成 状态行 <method> <request-URL&...

阅读全文

Java字节码常量池

引言上篇文章简单介绍了java Class 字节码文件的基本格式。本文我们直接通过阅读字节码文件来进一步理解字节码中的常量池结构 首先我们新建一个最简单的Java文件 12345public class Test { public static void main(String[] args) { System.out.println("hello world"); }} 编译之后使用文本编辑器打开,可以看到Class文件最...

阅读全文

Java Class文件结构

引言我们都知道java是跨平台的,原因就在于各个平台的java虚拟机可以载入和执行同一种平台无关的字节码文件,也就是说java虚拟机不与包括Java在内的任何语言绑定,只于Class文件这种二进制格式文件所关联。 基于这样的设计,到目前为止已经出现了很多基于Java虚拟机的语言 如groovy最终都会编译成class文件 Class文件结构一个Class文件唯一对应一个类或接口 现在让我们来看下Class文件的基本结构 Class文件以8位字节为基本单位的二进制文件,各个数据项目严格的按照...

阅读全文

Java类加载机制

引言介绍一下java类加载的过程 类加载的时机类从被加载到java虚拟机内存中开始,被分为7个阶段,包括加载,验证,准备,解析,初始化,使用,卸载 这里我们暂且主要看加载阶段和初始化阶段,java虚拟机主要是做了三件事情 加载 通过类的全限定名获取定义此类的二进制字节流 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 在内存中生成一个代表这个类的Class对象 注意这里虚拟机并没有规定类的二进制字节流的来源,所以我们其实通过自定义类加载器来实现从其他途径(如网络中获取)中...

阅读全文

ReentrantLock可重入锁源码分析

引言ReentrantLock可重入锁,也是日常使用除了synchronized关键字最多的锁。从字面上理解可重入的意思就是同一个线程可以重复加锁,当然synchronized关键字也是支持可重入的,其实它们的主要功能也是类似的,但是相比较来说,ReentrantLock功能更灵活丰富,例如ReentrantLock支持设置公平锁或非公平锁,支持分组唤醒需要唤醒的线程们,而不是像synchronized要么随机唤醒一个线程要么唤醒全部线程。 整个ReentrantLock的实现基于AQS独...

阅读全文

Java AQS 源码解析

引言AQS全称java.util.concurrent.locks.AbstractQueuedSynchronizer,是Java 并发包中的一个抽象类,我们一般把它叫做抽象队列同步器,如我们常用的可重入锁ReentrantLock的内部实现就是基于AQS,理解AQS的内部源码实现对于我们深入理解使用java并发包中的各个功能非常重要。 实现原理AQS内部维护了一个双向链表队列来管理多个线程。简单介绍一下就是,当有一个新的线程去尝试获取锁,这是如果获取失败,AQS则会将此线程封装成一个N...

阅读全文

Java CAS

引言在介绍CAS之前,我们有必要先理解线程安全的三大特性 原子性: 对于涉及共享变量访问的操作,该操作从其执行线程以外的任意线程来看是不可分割的,从而可以让各个线程依次串行访问,但是原子性并不保证可见性 可见性: 修改共享变量时,立即将工作内存中的值同步到主存中,并使该修改对其他线程可见 有序性: 禁止读取共享变量后的代码、修改共享变量前的代码重排序 CAS即compare and swap的缩写,中文翻译成比较并交换。是一种用于在多线程环境下实现同步功能的机制。调用Java CAS需...

阅读全文

Tomcat源码解析三 Connector连接器

引言上文分析了Tomcat的启动流程,我们已经大致理清了Tomcat启动的整个流程,本文将会对Connector连接器的创建进行分析 整体架构 上图完整了概括了整个Connector的架构体系,先简单的介绍一下各个组件的功能 Endpoint 用来处理底层Socket的网络连接 Processor 用来实现HTTP协议的 Adapter 将请求适配到Servlet容器进行具体的处理 org.apache.catalina.connector.Connector我们先来看下org.apa...

阅读全文

Tomcat源码解析二 启动过程

引言上文介绍了Tomcat设计的整体架构,对于接下来的源码分析非常重要。接下来我们将从Tomcat的入口启动开始分析Tomcat的源码 Tomcat的启动入口我们可以从其启动脚本catalina.sh中发现,是由org.apache.catalina.startup.Bootstrap.java的main方法启动的。现在我们就从Bootstrap.java开始分析tomcat的源码 Bootstrap在看Main函数之前,我们先看下静态块中的代码 123456789101112131415...

阅读全文

Tomcat源码解析一 架构初窥

引言Tomcat是一个非常复杂的Servlet容器,也是在日常工作中与我们接触非常多的Http服务器,作为一个成熟的软件,它的整体设计,代码结构都十分的优秀,作为开发者,非常有必要研读Tomcat源码。阅读源码总是开头难,但是一旦对整体设计理念有一定了解后,再进行深入分析,就会有不一样的收获。 整体架构先上一张总体架构图 这张图可以说每篇介绍Tomcat的博客都是必放,既然每个人都认可这张图,说明此图非常重要。接下来我们就围绕这张图对Tomcat的整体架构进行分析。 Server服务器...

阅读全文


Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2020 王俊男的技术杂谈 All Rights Reserved.

访客数 : | 访问量 :