java
Nostalgia_forever
目前就职于阿里巴巴
展开
-
How Tomcat Works 3
Tomcat体系结构中有一个非常重要的概念——连接器,看下面这张图一个connecotr对应一个container,connector用于接收请求,然后传递给container组件去处理,tomcat中默认的连接器是coyote,按照协议类型分,有http和ajp的连接器。HTTP/1.1协议负责建立HTTP连接,web应用通过浏览器访问tomcat服务器用的就是这个连接器,默认监原创 2015-04-06 18:46:54 · 679 阅读 · 0 评论 -
tomcat系列之整体结构
本系列文章是基于tomcat6.0的源码。首先分析一下tomcat的启动脚本,windows下的batif "%OS%" == "Windows_NT" setlocalrem ---------------------------------------------------------------------------rem Start script for the CATALIN原创 2015-01-02 18:37:38 · 919 阅读 · 0 评论 -
cglib的简单案例
本文的例子全部来自github上cglib的官方文档,有关cglib的教程少之又少,如果想学习觉得还是看看诸如Hibernate和Spring的源码来的实在。package com.tang;import static org.junit.Assert.assertEquals;import static org.junit.Assert.assertNotSame;import j原创 2015-04-05 15:29:28 · 2726 阅读 · 1 评论 -
ReentrantLock源码分析
深入理解java同步、锁机制我们主要讲解了关于synchronized的实现和各种锁的类型,本节将尝试从源码的角度去理解可重入锁ReentrantLock的实现。由于个人水平有限,文中出现错误的地方还请指出,避免误导更多人。要理解ReentrantLock需要先理解所有锁的基础。AQS(AbstractQueuedSynchronizer)主要利用硬件原语指令(CAS compare-and-原创 2015-03-13 21:41:18 · 3713 阅读 · 2 评论 -
深入理解java同步、锁机制
本片文章尝试从另一个层面来了解我们常见的同步(synchronized)和锁(lock)机制。如果读者想深入了解并发方面的知识推荐一本书《java并发编程实战》,非常经典的一本书,英语水平好的同学也可以读一读《Concurrent programming in Java - design principles and patterns》由Doug Lea亲自操刀,Doug Lea是并发方面的大神,原创 2015-03-12 21:15:19 · 5379 阅读 · 0 评论 -
How Tomcat Works 2
上一节编写了自己的一个简单的web服务器,只能处理静态的资源,本节将创建一个两个不同的servlet容器,能够简单的处理动态的内容。HttpServer1原创 2015-03-17 22:20:46 · 753 阅读 · 0 评论 -
关于GC
在介绍GC之前有必要先了解一下JVM的内存划分,这样在后面介绍GC和各种不同的GC collector的时候更容易理解。下面这张图是“偷”的别人的,很经典的描述了jvm的体系结构,我们只需要关注最大的那一块——运行时数据区域。1.方法区方法区为各个线程共享的一块内存区域,当虚拟机装载一个class文件时,它会从二进制数据中解析类型的信息,包括类的静态变量也会存储到该区域。虚拟机原创 2015-03-07 00:57:36 · 1406 阅读 · 0 评论 -
JDK工具介绍
jdk为我们提供了一些非常实用的小工具来帮助我们定位一些简单的JVM问题,这些小工具就在jdk/bin下面。不妨来分别看一下,本篇文章的工具都是使用的windows版本。1.jps从名字中可以大概看的出是做什么用的,了解liunx的都知道非常重要的一个命令ps——列出当前系统中的进程。同样jps是java版本的ps,列出当前系统中的java进程,下面是在我本机执行jps的结果:C:\U原创 2015-03-08 22:49:22 · 2587 阅读 · 0 评论 -
关于类的初始化
网上看到一个非常有意思的java面试题,感觉里面有不少可以讲的东西,拿来与大家分享一下:题目很简洁就是给出下面这段程序的输出内容:public class DispatchTest{ public static void main(String[] args) { Base b = new Sub(); System.out.println(b.x); }}class原创 2015-02-28 10:56:48 · 654 阅读 · 0 评论 -
从一道题目看类加载
有一道非常经典的题目,如果对虚拟机加载类的过程不熟悉,很容易就答错,题目如下:public class Singleton{ public static Singleton instance = new Singleton(); public static int a; public static int b = 0; private Singleton() { a++原创 2015-02-27 09:50:06 · 1003 阅读 · 0 评论 -
由一道题目引出的java多态
某次逛论坛时发现一个非常有意思的题目,如下:class A { public String show(A obj) { return ("A and A"); } public String show(B obj) {原创 2015-02-27 22:48:25 · 849 阅读 · 0 评论 -
How Tomcat Works 5
上一节简单介绍了tomcat中的流水线,当connector收到一条消息的时候,将socket交给processor来处理,processor构造出来request和response对象并解析http请求,然后processor调用container的的invoke方法来处理这两个对象。invoke方法是父类ContainerBase中的方法,主要是调用该Container对应的Pipeline处原创 2015-04-19 10:39:59 · 709 阅读 · 0 评论 -
How Tomcat Works 6
了解tomcat的人可能知道tomcat是由一个个的组件组成的,有些组件可以包含子组件,比如容器中可能包含loader、manager等组件。不了解tomcat结构的可以看下本系列的第三节。tomcat用catalina类来表示整个tomcat,在Catalina中负责初始化和启动这些组件。我们不需要去依次处理每个组件的启动,tomcat中父组件负责启动和停止它下面所有的子组件,因此我们只需要启动原创 2015-04-19 14:13:57 · 968 阅读 · 0 评论 -
tomcat系列之类加载器
jvm中有三种类加载器,好吧,为了介绍tomcat中的类加载器,先来普及下类加载器的概念,参见这篇文章——JVM类加载器 。就像JVM的类加载器一样,为了安全tomcat中自己扩展了几种类加载器,分别来加载不同路径下的lib库,因为一个tomcat可以部署不同的应用,如果各个应用的lib库由相同的类加载器加载那么带来的安全隐患不言而喻 。来看一下标准的tomcat目录:原创 2015-01-02 18:42:29 · 400 阅读 · 0 评论 -
win10-x64系统下编译OpenJDK
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl原创 2016-12-11 22:13:36 · 10527 阅读 · 10 评论 -
java内存模型和多线程
单个处理器的频率越来越难以提升,因此人们转而面向多处理器,这么多年来致力于提高程序的运行效率,然而面向多核处理器的并发编程却不是那么的轻松,java在语言级别提供的多线程并发能力为我们编写并发的程序提供了不少便利。但是本文并不打算讲述如何编写多线程并发程序,而是尝试从另一个角度理解一下java并发和多线程的基础,理解其中的内容能够帮助我们更好的使用java的并发库。本文所涉及的有些内容可能和我原创 2016-07-21 00:37:56 · 1049 阅读 · 0 评论 -
pipeline机制
最近在看netty的源码,准备将一些理解和总结写出来,netty的源码写的很漂亮理解起来也不是那么容易,很值得我们去学习和借鉴。我们知道在设计模式里面提到过一种责任链的模式,据我看一些源码的了解(不管是公司的中间件还是一些开源的项目),责任链的应用非常广泛,包括现在在公司做的东西。其中netty很好的扩展了责任链模式来实现netty的骨架,我们这里称它为pipeline模式。如果将数据比作是水原创 2015-11-27 20:22:13 · 8063 阅读 · 0 评论 -
java异步编程
很多时候我们都希望能够最大的利用资源,比如在进行IO操作的时候尽可能的避免同步阻塞的等待,因为这会浪费CPU的资源。如果在有可读的数据的时候能够通知程序执行读操作甚至由操作系统内核帮助我们完成数据的拷贝,这再好不过了。从NIO到CompletableFuture、Lambda、Fork/Join,java一直在努力让程序尽可能变的异步甚至拥有更高的并行度,这一点一些函数式语言做的比较好,因此jav原创 2015-11-15 22:11:01 · 32789 阅读 · 5 评论 -
mybatis入门
mybatis作为一种ORM框架,实现了数据库中表和普通java pojo的映射,使得我们从繁重和重复的jdbc中解脱出来。举个例子:假如我们有下面一张表很简单,表名称是t_user,字段如图所示。我们知道写sql语句可以将表里的数据查询出来,如果使用java将数据查询出来,需要用到mysql的jdbc驱动,然后针对jdbc去编写查询的逻辑。大概的过程如下//第一步:加载M原创 2015-09-01 00:57:05 · 680 阅读 · 0 评论 -
简单实现一个rpc框架
与其说框架不如讲是个小demo,废话不多说直接上代码package com.tang.rpc;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.lang.reflect.InvocationHandler;import j原创 2015-08-30 22:52:45 · 1373 阅读 · 0 评论 -
自定义spirng schema
spring已经为我们提供了很丰富的xml元素,但是有时候我们需要自己扩展spring schema来定制标签,spring已经为我们提供了扩展的api,使用起来非常方便。本片文章来自于spring官网的教程。如果要定义自己的schema,通常有如下几步:1、自定义xml schema,在这里是编写自己的xsd文件,xsd文件可以理解为描述xml文件的元文件,定义了一个xml文件中可以有哪原创 2015-07-18 13:54:07 · 1119 阅读 · 0 评论 -
认识kafka
kafka是一个分布式的消息队列由scala编写,不同于传统的一些消息队列,kafka的设计理念与众不同。1、kafka的特点。快速单台kafka的broker实例能够支撑几千台机器每秒几百兆字节的读写,如果组成集群性能会更强进,从很多人的测试情况来看kafka的读写性能表现不输于当前流行的消息队,甚至领先很多。。扩展性弹性透明的扩展,不需要停机,kafka的数据是分区的,可以原创 2015-05-17 23:34:02 · 2121 阅读 · 1 评论 -
zookeeper实现分布式的思路
Hadoop生态系统为开源届提供很多优秀软件,zookeeper便是其中一员。前段时间项目中用到了zookeeper,主要是用作服务的注册和发现使用方式类似阿里的dubbo。实际上zookeeper的功能不仅仅只有这些内容,它提供了一系列非常方便使用的功能,后面会提到。这篇文章仅仅是我个人的一点儿理解,如有错误烦请指正,以免给别人误导。1、zookeeper是什么zookeeper的名原创 2015-05-17 00:45:59 · 5561 阅读 · 0 评论 -
How Tomcat Works 4
本系列第四节重点讲讲tomcat中的流水线和阀门。如果你了解servlet的过滤器那么理解流水线会容易得多,因为他们两个的原理是一样的。一个流水线就像是一个过滤链,上面的阀门就和过滤器一样,在tomcat中阀门可以操作传递给他们的Request和Resopnse对象。实际上这两种工作模式都是基于责任链模式实现的,如果不清楚责任链模式可以去网上查一查。tomcat中的ValveBase就是表原创 2015-04-12 22:09:05 · 454 阅读 · 0 评论 -
各种排序算法python和java实现(一)
先从最简单的实现冒泡排序:# -*- coding: UTF-8 -*-intarray=[3,4,5,1,2,7,2,9,0]def bubble(array): for i in range(1,len(array)): for j in range(i): if array[j] > array[i]: array[j],array[i]原创 2015-01-04 22:26:01 · 850 阅读 · 0 评论 -
jvm的happens-before原则
提到并发,通常首先想到是锁,其实对共享资源的互斥操作是一方面,在java中还有一方面是内存的可见性和顺序化,了解JMM的同学可能会更清楚些,内存可见性和顺序性同样非常重要,在这里简单提一下JMM模型,首先介绍一下SMP(对称多处理结构)如下图:在计算机中缓存到处可见,我们知道cpu的运算速度非常快,而从内存、甚至磁盘的读取速度则相对慢了几个数量级,所以缓存起到的是一个缓冲的作用,提高c原创 2015-01-02 18:32:27 · 1771 阅读 · 0 评论 -
从HelloWorld中我们能学到什么
借着有道词典翻译下,以后方便查看。HelloWorld小程序是每个java程序员都知道。让我们来看看我们能从这个小程序中学到什么。简单的开头能让我们更容易的学习复杂的知识。这篇文章读起来会很有趣,不仅仅适合入门级的java程序员。如果hello world对你意味着更多,欢迎评论。HelloWorld.java public class HelloWorld { /** *翻译 2014-12-26 22:57:45 · 809 阅读 · 0 评论 -
一个简单的java多线程例子
现在有这样一个任务,有一份手机号列表(20W),有一份话单的列表(10W),要统计哪些手机号没有出现在话单中,哪些手机号在话单中出现了不止一次。想到的最直接的方式,就是两层循环去遍历,虽然此方法比较笨,但目前还没有想出更好的办法。一开始使用单线程来处理,代码是随手写的并没有进行重构,只是做一个简单的说明:package tool;import java.util.List;pu原创 2015-02-03 00:47:09 · 2599 阅读 · 0 评论 -
各种排序算法python和java实现(二)
第一篇博客实现了三种最基本最简单的排序算法,本篇文章将在这三种算法的基础上稍微演变一下。1.快排光从名字看就知道速度肯定不差,前一篇讲的冒泡排序,怎么看都不算是一种好的排序算法,里面充斥了太多的无谓的交换动作,时间复杂度倒是很稳定o(n^2),但对于排序算法实在说不过去。快排是冒泡排序的改进版,思路就是分治,将一个序列随机按照某个值分成两个子序列,子序列A里面的值全部比该值大,另一个子序列原创 2015-01-09 23:13:15 · 679 阅读 · 0 评论 -
How Tomcat Works 1
一直以来都在使用Tomcat作为servlet容器,很好奇tomcat的工作原理和结构。正好How tomcat works这本书讲解的比较清晰,虽然很多东西不懂,但也要慢慢来研究一下,这样才能有提高。tomcat中最核心的部分是catalina,我们可以将其简单的看做由两个主要模块构成的,连接器connector和容器container,他们之间的对应关系如下连接器负责为接收到得每个ht原创 2013-06-01 13:26:58 · 786 阅读 · 0 评论 -
java动态代理
很多开源框架大量使用了的动态代理(好像大多用的cglib库),减少代码的重复量。因此看了看java自带的JDK动态代理方面的知识,现在记下自己的一点理解。(水平有限,难免出现错误,请多指正)JDK实现动态代理主要靠InvocationHandler接口和Proxy类,并且被代理对象需要至少实现一个接口(小小的不足,cglib好像没有此限制),下面给出代理实现的一般步骤。创建一个接口pa原创 2013-04-24 17:08:49 · 692 阅读 · 0 评论 -
数据结构之二叉查找树
针对二叉查找树的操作(增删改查)的时间和树的高度成正比,比如都有10个节点的一个树,树高为4和树高为10的操作时间肯定是不同的,这个时间实际上是O(lgn),二叉查找树的期望的树高是lgn,从而基本动态集合的操作平均时间为θ(lgn)。通常二叉查找树基于链表实现,每个节点保存左,右子节点,如果想更方便的实现前后查找,可以增加个一个父节点属性。由于二叉查找树的特点,采用中序遍历可以按照从小到大的原创 2014-12-17 20:06:02 · 430 阅读 · 0 评论 -
tomcat系列分析之生命周期管理初始化动作
tomcat中有很多组件,要对这些组件进行生命周期的管理非常困难,tomcat中采用的是抽象出一个生命周期管理接口,然后所有的组件都实现该接口,当父组件启动时,同事负责将子组件启动起来,从而完成整tomcat的初始、启动、结束等动作。来看下tomcat启动的过程,首先构造Bootstrap类,调用其中的init方法,完成类加载器的初始化,方便后面加载类使用,然后调用其中的load方法,实际上t原创 2015-01-01 22:58:19 · 772 阅读 · 0 评论 -
数据结构之红黑树
上一节我们自己简单实现了一棵二叉查找树(数据结构之二叉查找树),虽然理论上二叉查找树的搜索时间是Olngn和树高成正比,但是实际上二叉查找树的平衡性并不理想,因此后面又出来了平衡二叉树,红黑树就是一种平衡的二叉查找树,先来看下什么是二叉查找树,对应我们熟悉的二分法查找,二叉查找树非常类似,二叉查找树的定义如下:(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)原创 2015-01-02 20:03:42 · 851 阅读 · 0 评论 -
jdk集合源码之HashMap
分析完数组和链表,再来分析下HashMap的源码,基于K-V方式的存储结构,简单想象一下,典型的实现是基于数组+链表,正好我们前面分析完了数组和链表。废话不多说,直接上源码。还是先从构造函数看起:public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0)原创 2015-01-02 19:31:39 · 550 阅读 · 0 评论 -
jdk集合源码之LinkedList
LinkedList不同于ArrayList,它底层使用的是双向循环链表实现的。继承自AbstractSequentialList不支持随机访问,同时一个LinkedList也是一个双端队列,支持从两端的增删,双端队列在某些多线程并发的场景下有很大的作用,比如两个线程同时从头和尾取数据,不需要加锁。要理解LinkedList的实现原理,先要认识下它的基础存储结构Entryp原创 2015-01-02 19:13:29 · 498 阅读 · 0 评论 -
jdk集合源码之ArrayList
经常使用jdk提供给我们的集合,比如ArrayList,LinkedList,HashMap等等,还学习过他们之间的不同和相同点,比如ArrayList查询快,新增删除慢,LinkedList则相反,没有看过底层的源码,是没办法理解这些特性的。ArrayList是基于数组的实现,在内存中是一块儿连续的空间,所以查询速度快,但是当涉及到新增和删除的时候,需要涉及到数据的拷贝,而LinkedList是原创 2015-01-02 18:57:24 · 492 阅读 · 0 评论 -
java并发包的CAS操作
参考文档:http://www.blogjava.net/xylz/archive/2010/07/04/325206.htmlhttp://blog.hesey.net/2011/09/resolve-aba-by-atomicstampedreference.htmlhttp://www.searchsoa.com.cn/showcontent_69238.htm转载 2014-12-22 19:57:10 · 2345 阅读 · 0 评论 -
持续集成(Continuous Integration)
持续集成 作者:Martin Fowler 译者:滕云原文发布时间:2006年5月1日 翻译时间:2012年2月25日原文链接:http://www.martinfowler.com/articles/continuousIntegration.html(此翻译已获原作者同意,事实上你不必这么做的,但请参考此FAQ中相关条款)转载 2015-02-07 23:22:56 · 3697 阅读 · 0 评论 -
java体系结构
本文参考《深入java虚拟机第二版》基于jdk1.2,由于书年代比较久远,可能有些东西不太一样,但不妨碍它的价值。java体系结构包括四种技术:1.java程序语言本身,也即语法等等。2.java class文件格式,包括class文件的定义和存储的内容。3.java api4.java虚拟机 JVM我们使用java来编写java程序调用为我们提供的api来操作系统的资源,原创 2015-02-08 21:35:00 · 1073 阅读 · 0 评论