- 博客(49)
- 资源 (6)
- 收藏
- 关注

原创 数据结构之红黑树
上一节我们自己简单实现了一棵二叉查找树(数据结构之二叉查找树),虽然理论上二叉查找树的搜索时间是Olngn和树高成正比,但是实际上二叉查找树的平衡性并不理想,因此后面又出来了平衡二叉树,红黑树就是一种平衡的二叉查找树,先来看下什么是二叉查找树,对应我们熟悉的二分法查找,二叉查找树非常类似,二叉查找树的定义如下:(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)
2015-01-02 20:03:42
888
原创 win10-x64系统下编译OpenJDK
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl
2016-12-11 22:13:36
10604
2
原创 java内存模型和多线程
单个处理器的频率越来越难以提升,因此人们转而面向多处理器,这么多年来致力于提高程序的运行效率,然而面向多核处理器的并发编程却不是那么的轻松,java在语言级别提供的多线程并发能力为我们编写并发的程序提供了不少便利。但是本文并不打算讲述如何编写多线程并发程序,而是尝试从另一个角度理解一下java并发和多线程的基础,理解其中的内容能够帮助我们更好的使用java的并发库。本文所涉及的有些内容可能和我
2016-07-21 00:37:56
1082
原创 pipeline机制
最近在看netty的源码,准备将一些理解和总结写出来,netty的源码写的很漂亮理解起来也不是那么容易,很值得我们去学习和借鉴。我们知道在设计模式里面提到过一种责任链的模式,据我看一些源码的了解(不管是公司的中间件还是一些开源的项目),责任链的应用非常广泛,包括现在在公司做的东西。其中netty很好的扩展了责任链模式来实现netty的骨架,我们这里称它为pipeline模式。如果将数据比作是水
2015-11-27 20:22:13
8230
原创 java异步编程
很多时候我们都希望能够最大的利用资源,比如在进行IO操作的时候尽可能的避免同步阻塞的等待,因为这会浪费CPU的资源。如果在有可读的数据的时候能够通知程序执行读操作甚至由操作系统内核帮助我们完成数据的拷贝,这再好不过了。从NIO到CompletableFuture、Lambda、Fork/Join,java一直在努力让程序尽可能变的异步甚至拥有更高的并行度,这一点一些函数式语言做的比较好,因此jav
2015-11-15 22:11:01
32849
1
原创 oracle事务和锁
oracle中的语句级一致性可以保证一个事务只能看到查询开始之前已经提交的事务更改的数据,未提交的事务和查询开始之后提交的数据不会被查询到。做下面的一个实验来验证一下数据准备如下:----------create table-----------------create table test (id varchar2(128),name varchar2(128));-------
2015-10-18 15:12:38
2263
原创 mybatis入门
mybatis作为一种ORM框架,实现了数据库中表和普通java pojo的映射,使得我们从繁重和重复的jdbc中解脱出来。举个例子:假如我们有下面一张表很简单,表名称是t_user,字段如图所示。我们知道写sql语句可以将表里的数据查询出来,如果使用java将数据查询出来,需要用到mysql的jdbc驱动,然后针对jdbc去编写查询的逻辑。大概的过程如下//第一步:加载M
2015-09-01 00:57:05
710
原创 简单实现一个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
1404
原创 自定义spirng schema
spring已经为我们提供了很丰富的xml元素,但是有时候我们需要自己扩展spring schema来定制标签,spring已经为我们提供了扩展的api,使用起来非常方便。本片文章来自于spring官网的教程。如果要定义自己的schema,通常有如下几步:1、自定义xml schema,在这里是编写自己的xsd文件,xsd文件可以理解为描述xml文件的元文件,定义了一个xml文件中可以有哪
2015-07-18 13:54:07
1147
原创 认识kafka
kafka是一个分布式的消息队列由scala编写,不同于传统的一些消息队列,kafka的设计理念与众不同。1、kafka的特点。快速单台kafka的broker实例能够支撑几千台机器每秒几百兆字节的读写,如果组成集群性能会更强进,从很多人的测试情况来看kafka的读写性能表现不输于当前流行的消息队,甚至领先很多。。扩展性弹性透明的扩展,不需要停机,kafka的数据是分区的,可以
2015-05-17 23:34:02
2156
1
原创 zookeeper实现分布式的思路
Hadoop生态系统为开源届提供很多优秀软件,zookeeper便是其中一员。前段时间项目中用到了zookeeper,主要是用作服务的注册和发现使用方式类似阿里的dubbo。实际上zookeeper的功能不仅仅只有这些内容,它提供了一系列非常方便使用的功能,后面会提到。这篇文章仅仅是我个人的一点儿理解,如有错误烦请指正,以免给别人误导。1、zookeeper是什么zookeeper的名
2015-05-17 00:45:59
5608
原创 How Tomcat Works 6
了解tomcat的人可能知道tomcat是由一个个的组件组成的,有些组件可以包含子组件,比如容器中可能包含loader、manager等组件。不了解tomcat结构的可以看下本系列的第三节。tomcat用catalina类来表示整个tomcat,在Catalina中负责初始化和启动这些组件。我们不需要去依次处理每个组件的启动,tomcat中父组件负责启动和停止它下面所有的子组件,因此我们只需要启动
2015-04-19 14:13:57
996
原创 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
739
原创 How Tomcat Works 4
本系列第四节重点讲讲tomcat中的流水线和阀门。如果你了解servlet的过滤器那么理解流水线会容易得多,因为他们两个的原理是一样的。一个流水线就像是一个过滤链,上面的阀门就和过滤器一样,在tomcat中阀门可以操作传递给他们的Request和Resopnse对象。实际上这两种工作模式都是基于责任链模式实现的,如果不清楚责任链模式可以去网上查一查。tomcat中的ValveBase就是表
2015-04-12 22:09:05
470
原创 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
705
原创 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
2767
1
原创 How Tomcat Works 2
上一节编写了自己的一个简单的web服务器,只能处理静态的资源,本节将创建一个两个不同的servlet容器,能够简单的处理动态的内容。HttpServer1
2015-03-17 22:20:46
776
原创 ReentrantLock源码分析
深入理解java同步、锁机制我们主要讲解了关于synchronized的实现和各种锁的类型,本节将尝试从源码的角度去理解可重入锁ReentrantLock的实现。由于个人水平有限,文中出现错误的地方还请指出,避免误导更多人。要理解ReentrantLock需要先理解所有锁的基础。AQS(AbstractQueuedSynchronizer)主要利用硬件原语指令(CAS compare-and-
2015-03-13 21:41:18
3750
原创 深入理解java同步、锁机制
本片文章尝试从另一个层面来了解我们常见的同步(synchronized)和锁(lock)机制。如果读者想深入了解并发方面的知识推荐一本书《java并发编程实战》,非常经典的一本书,英语水平好的同学也可以读一读《Concurrent programming in Java - design principles and patterns》由Doug Lea亲自操刀,Doug Lea是并发方面的大神,
2015-03-12 21:15:19
5456
原创 JDK工具介绍
jdk为我们提供了一些非常实用的小工具来帮助我们定位一些简单的JVM问题,这些小工具就在jdk/bin下面。不妨来分别看一下,本篇文章的工具都是使用的windows版本。1.jps从名字中可以大概看的出是做什么用的,了解liunx的都知道非常重要的一个命令ps——列出当前系统中的进程。同样jps是java版本的ps,列出当前系统中的java进程,下面是在我本机执行jps的结果:C:\U
2015-03-08 22:49:22
2630
原创 JVM中方法调用的实现
我们写代码时方法调用是最常见的场景,但是这种最常见的场景在JVM中是如何实现的呢,下面就一起来探索一番。该博客主要分为两块:一是jvm如何找到要调用的是哪个方法,此处涉及到方法的重载重写等特性,也就是多态的实现原理,包括jvm的静态解析,分派等特性。二是找到了要调用的方法,jvm具体是怎么执行的,这部分内容前面的一些博客零散的涉及到了,包括线程栈中的操作数栈入栈出栈,局部变量表,动态链
2015-03-07 19:00:12
1489
原创 关于GC
在介绍GC之前有必要先了解一下JVM的内存划分,这样在后面介绍GC和各种不同的GC collector的时候更容易理解。下面这张图是“偷”的别人的,很经典的描述了jvm的体系结构,我们只需要关注最大的那一块——运行时数据区域。1.方法区方法区为各个线程共享的一块内存区域,当虚拟机装载一个class文件时,它会从二进制数据中解析类型的信息,包括类的静态变量也会存储到该区域。虚拟机
2015-03-07 00:57:36
1423
原创 关于类的初始化
网上看到一个非常有意思的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
678
原创 由一道题目引出的java多态
某次逛论坛时发现一个非常有意思的题目,如下:class A { public String show(A obj) { return ("A and A"); } public String show(B obj) {
2015-02-27 22:48:25
871
原创 从一道题目看类加载
有一道非常经典的题目,如果对虚拟机加载类的过程不熟悉,很容易就答错,题目如下: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
1034
原创 jenkins
在介绍jenkins之前需要先了解一个概念CI(Continuous Integration)持续集成,不了解的先看下这篇文章:持续集成,这个概念来自很流行的敏捷开发,讲究的是快速的发现问题,快速发现问题需要的是快速的迭代开发,不同于很传统的瀑布式开发。了解了CI的概念,那么jenkins是什么,其实就是我们实现CI的一种工具,jenkins是开源的,当然业界还有其他的CI工具,但是jenki
2015-02-13 02:09:57
3447
原创 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
1105
转载 持续集成(Continuous Integration)
持续集成 作者:Martin Fowler 译者:滕云原文发布时间:2006年5月1日 翻译时间:2012年2月25日原文链接:http://www.martinfowler.com/articles/continuousIntegration.html(此翻译已获原作者同意,事实上你不必这么做的,但请参考此FAQ中相关条款)
2015-02-07 23:22:56
3732
原创 一个关于awk命令和sort命令的小例子
假设现在有如下一个txt的文本记录:a|b|c|150203161843.289|||1|2|c|150203161843.300|||a|m|c|150203161943.289||||b|c|150203162843.289|||a||c|150203171843.289|||按|分割后的第四个域表示的时间,假设现在需要把第四个域单独提取到一个文件中,那么使用下面的命令即可完成
2015-02-03 17:27:47
4850
原创 一个简单的java多线程例子
现在有这样一个任务,有一份手机号列表(20W),有一份话单的列表(10W),要统计哪些手机号没有出现在话单中,哪些手机号在话单中出现了不止一次。想到的最直接的方式,就是两层循环去遍历,虽然此方法比较笨,但目前还没有想出更好的办法。一开始使用单线程来处理,代码是随手写的并没有进行重构,只是做一个简单的说明:package tool;import java.util.List;pu
2015-02-03 00:47:09
2642
原创 shell十三问总结
我们知道计算机的硬件资源比如磁盘,IO,内存都是由软件来统一管理的,这类特殊的软件就是常说的操作系统,windows在底层的资源控制基础上构建了自己的界面,非常适合使用,只需要到处点点就能完成我们需要的功能。这是一种控制资源的方式,同时也可以使用command的方式来操作底层的资源。liunx中最重要的部分是它的内核,内核管理着系统的资源,同时也提供给我们操作内核的接口,就是我们经常用到的shel
2015-02-02 02:42:57
1310
原创 python小练习
python版本使用的是2.7,在java中读取文件的操作是new出一个FileReader然后传入一个File对象,读取可以使用FileReader的read方法依次读取字符或者读入到某个字符的数组中。在python中读取文件的操作比java要简单不少:
2015-01-23 01:01:21
1640
原创 各种排序算法python和java实现(二)
第一篇博客实现了三种最基本最简单的排序算法,本篇文章将在这三种算法的基础上稍微演变一下。1.快排光从名字看就知道速度肯定不差,前一篇讲的冒泡排序,怎么看都不算是一种好的排序算法,里面充斥了太多的无谓的交换动作,时间复杂度倒是很稳定o(n^2),但对于排序算法实在说不过去。快排是冒泡排序的改进版,思路就是分治,将一个序列随机按照某个值分成两个子序列,子序列A里面的值全部比该值大,另一个子序列
2015-01-09 23:13:15
697
原创 各种排序算法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
869
原创 jdk集合源码之HashMap
分析完数组和链表,再来分析下HashMap的源码,基于K-V方式的存储结构,简单想象一下,典型的实现是基于数组+链表,正好我们前面分析完了数组和链表。废话不多说,直接上源码。还是先从构造函数看起:public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0)
2015-01-02 19:31:39
568
原创 jdk集合源码之LinkedList
LinkedList不同于ArrayList,它底层使用的是双向循环链表实现的。继承自AbstractSequentialList不支持随机访问,同时一个LinkedList也是一个双端队列,支持从两端的增删,双端队列在某些多线程并发的场景下有很大的作用,比如两个线程同时从头和尾取数据,不需要加锁。要理解LinkedList的实现原理,先要认识下它的基础存储结构Entryp
2015-01-02 19:13:29
522
原创 jdk集合源码之ArrayList
经常使用jdk提供给我们的集合,比如ArrayList,LinkedList,HashMap等等,还学习过他们之间的不同和相同点,比如ArrayList查询快,新增删除慢,LinkedList则相反,没有看过底层的源码,是没办法理解这些特性的。ArrayList是基于数组的实现,在内存中是一块儿连续的空间,所以查询速度快,但是当涉及到新增和删除的时候,需要涉及到数据的拷贝,而LinkedList是
2015-01-02 18:57:24
509
原创 tomcat系列之类加载器
jvm中有三种类加载器,好吧,为了介绍tomcat中的类加载器,先来普及下类加载器的概念,参见这篇文章——JVM类加载器 。就像JVM的类加载器一样,为了安全tomcat中自己扩展了几种类加载器,分别来加载不同路径下的lib库,因为一个tomcat可以部署不同的应用,如果各个应用的lib库由相同的类加载器加载那么带来的安全隐患不言而喻 。来看一下标准的tomcat目录:
2015-01-02 18:42:29
433
原创 tomcat系列之整体结构
本系列文章是基于tomcat6.0的源码。首先分析一下tomcat的启动脚本,windows下的batif "%OS%" == "Windows_NT" setlocalrem ---------------------------------------------------------------------------rem Start script for the CATALIN
2015-01-02 18:37:38
942
原创 jvm的happens-before原则
提到并发,通常首先想到是锁,其实对共享资源的互斥操作是一方面,在java中还有一方面是内存的可见性和顺序化,了解JMM的同学可能会更清楚些,内存可见性和顺序性同样非常重要,在这里简单提一下JMM模型,首先介绍一下SMP(对称多处理结构)如下图:在计算机中缓存到处可见,我们知道cpu的运算速度非常快,而从内存、甚至磁盘的读取速度则相对慢了几个数量级,所以缓存起到的是一个缓冲的作用,提高c
2015-01-02 18:32:27
1804
自己写的jenkins介绍ppt整理
2015-02-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人