Java学习
少主无翼
热衷并发编程,个人博客:http://vickyqi.com/
展开
-
Hadoop1.2.1源码解析系列:JT与TT之间的心跳通信机制——JT篇
上一篇浅析了Hadoop心跳机制的TT(TaskTracker)方面,这一篇浅析下JT(JobTracker)方面。我们知道心跳是TT通过RPC请求调用JT的heartbeat()方法的,TT在调用JT的heartbeat回收集自身的状态信息封装到TaskTrackerStatus对象中,传递给JT。下面看看JT如何处理来自TT的心跳。原创 2013-12-05 00:36:12 · 3825 阅读 · 4 评论 -
JDK并发工具类源码学习系列——ConcurrentHashMap
欢迎阅读原文:JDK并发工具类源码学习系列——ConcurrentHashMap 作为JDK并发工具类源码学习系列的第一个被分析的类,ConcurrentHashMap类在我的开发过程中经常被使用。个人觉得如果在共享一个Map时,如果无法判断是否需要加锁,那么就干脆直接使用ConcurrentHashMap,即能保证并发安全,同时性能也不会有太多下降,因为ConcurrentHashMap可实现无原创 2015-10-26 17:46:58 · 2176 阅读 · 0 评论 -
正则学习二三事
本文介绍了正则中的一些基础知识点,以及一些自己的经验总结和实际使用案例。原创 2015-09-25 14:19:13 · 933 阅读 · 0 评论 -
JDK并发工具类源码学习系列——ConcurrentSkipListMap
ConcurrentSkipListMap在JDK并发工具类使用范围不是很广,它是针对某一特殊需求而设计的——支持排序,同时支持搜索目标返回最接近匹配项的导航方法。一般情况下开发者很少会使用到该类,但是如果你有如上的特殊需求,那么ConcurrentSkipListMap将是一个很好地解决方案。 本文通过对JDK的ConcurrentSkipListMap的代码详细分析,深入分析其实现原理。原创 2015-11-13 12:19:22 · 4774 阅读 · 0 评论 -
JDK并发工具类源码学习系列——ConcurrentSkipListMap(续)
ConcurrentSkipListMap在JDK并发工具类使用范围不是很广,它是针对某一特殊需求而设计的——支持排序,同时支持搜索目标返回最接近匹配项的导航方法。一般情况下开发者很少会使用到该类,但是如果你有如上的特殊需求,那么ConcurrentSkipListMap将是一个很好地解决方案。 本篇通过对JDK ConcurrentSkipListMap的代码实现进行详细分析,解读其实现原理。原创 2015-11-13 12:17:11 · 1258 阅读 · 0 评论 -
坑爹的Spring数据源——自动提交事务
记一次数据源的自动提交事务带来的烦恼,并通过分析找到JBoss JNDI数据源默认自动提交事务的解决方案原创 2015-11-10 15:48:53 · 11639 阅读 · 0 评论 -
使用Apache Commons CLI开发命令行工具
本文简单介绍了如何使用Apache Commons CLI构建一个简单实用的命令行工具。原创 2015-09-17 20:03:44 · 6470 阅读 · 0 评论 -
排序算法系列——基数排序
基数排序不同于其他的七种排序算法,它是基于一种分配法,而非比较。基数排序属于“分配式排序”(distribution sort),基数排序法又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用。它的灵感来自于队列(Queue),它最独特的地方在于利用了数字的有穷性(阿拉伯数字只有0到9的10个)。原创 2015-08-21 12:05:09 · 1699 阅读 · 0 评论 -
排序算法系列——八大排序算法对比分析
本系列最后一篇,综合分析下前面介绍的八种排序算法的效率,以及各自的适用情况。 通知实际测试比较各排序算法的效率,并分析各个排序算法的适用场景。原创 2015-08-21 19:14:48 · 3304 阅读 · 1 评论 -
排序算法系列——归并排序
归并排序的核心思想同上一篇介绍的快速排序,都是采用了分治法的思想。其基本思想是将一个待排序序列,划分成两个子序列,然后将这两个子序列排好序之后合并,并递归的将子序列划分为更小的子序列,一直到只有一个元素的子序列,然后自底向上两两合并。原创 2015-08-20 13:42:48 · 973 阅读 · 0 评论 -
排序算法系列——快速排序
快速排序同冒泡排序,是交换排序的一种。快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。快速排序的时间复杂度是O(nlogn),比其他O(n^2)的排序算法快很多,不过实现起来还是有一定难度的。 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问原创 2015-08-19 17:35:39 · 1298 阅读 · 0 评论 -
JDK并发工具类源码学习系列——ConcurrentLinkedQueue
ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部,当我们获取一个元素时,它会返回队列头部的元素。它采用了“wait-free”算法来实现,该算法在Michael & Scott算法上进行了一些修改, Michael & Scott算法的详细信息可以参见[参考资料一]原创 2015-10-30 09:51:28 · 1854 阅读 · 0 评论 -
JDK并发工具类源码学习系列——CopyOnWriteArrayList
CopyOnWriteArrayList是ArrayList的一个线程安全的变体,其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的复制来实现的。 这一般需要很大的开销,但是当遍历操作的数量大大超过可变操作的数量时,这种方法可能比其他替代方法更 有效。在不能或不想进行同步遍历,但又需要从并发线程中排除冲突时,它也很有用。“快照”风格的迭代器方法在创建迭代器时使用了对数组状态的引用原创 2015-11-17 14:42:17 · 1380 阅读 · 1 评论 -
数据结构系列——堆
堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构。原创 2015-11-19 13:13:20 · 2606 阅读 · 0 评论 -
Hadoop1.2.1源码解析系列:JobTracker(一)——JobTracker初始化
JobTracker是hadoop的mapreduce框架中最重要的一个类,这个类负责整个集群的作业控制和资源管理,所以深入了解它是很有必要的。本文从main方法着手对JobTracker的启动进行了解析,描述了JobTracker的初始化以及启动一些重要线程的功能,后面会继续对其他部分进行解析。原创 2013-11-24 23:52:06 · 3171 阅读 · 0 评论 -
几种常用JSON库性能比较
JSON不管是在Web开发还是服务器开发中是相当常见的数据传输格式,一般情况我们对于JSON解析构造的性能并不需要过于关心,除非是在性能要求比较高的系统。 目前对于Java开源的JSON类库有很多种,下面我们取三个常用的JSON库进行性能测试对比,同时根据测试结果分析如果根据实际应用场景选择最合适的JSON库。 四个JSON类库分别为:Gson,FastJson,Jackson,Json-lib。原创 2015-09-01 17:15:28 · 26676 阅读 · 0 评论 -
算法系列:PageRank算法的MapReduce实现
首先简单介绍PageRank的算法公式:(图片来源:http://en.wikipedia.org/wiki/Page_rank)PR(A)即A的PageRank值;d为阻尼因子,一般设为0.85;L(B)即B网站所有的出链数量(即B网站内的所有链接的数量)。所以公式的意义是:A的PageRank值=(1-d)+d*(链接到A的所有网站的PR值/该网站的所有出链数量之和)。这里首次计算原创 2014-03-01 17:28:09 · 3503 阅读 · 12 评论 -
JDK并发工具类源码学习系列——介绍
JDK并发工具类是JDK1.5引入的一大重要的功能,集中在java.util.concurrent包下,java.util.concurrent包下还包括了java.util.concurrent.atomic以及java.util.concurrent.locks两个子包。java.util.concurrent包主要包含了并发集合类以及线程池和信号量三组重要工具类;原创 2015-12-01 17:00:14 · 3003 阅读 · 1 评论 -
JDK并发工具类源码学习系列——SynchronousQueue
SynchronousQueue是一种特殊的阻塞队列,不同于LinkedBlockingQueue、ArrayBlockingQueue和PriorityBlockingQueue,其内部没有任何容量,任何的入队操作都需要等待其他线程的出队操作,反之亦然。如果将SynchronousQueue用于生产者/消费者模式,那么相当于生产者和消费者手递手交易,即生产者生产出一个货物,则必须等到消费者过来取原创 2015-11-30 19:01:19 · 3686 阅读 · 0 评论 -
数据结构系列——后缀树(附Java实现代码)
后缀树,说的通俗点就是将一个字符串所有的后缀按照前缀树(Trie树,可参考此篇文章)的形式组织成一棵树。本文章介绍了后缀树的应用以及使用如何使用Java实现Ukkonen算法构建后缀树原创 2015-11-27 13:34:38 · 5841 阅读 · 0 评论 -
数据结构系列——Java后缀树实现代码
上一篇文章介绍了什么是后缀树以及后缀树的应用场景,同时结合Ukkonen算法论文细述了如何在O(n)时间内构建一颗后缀树,这一篇详细介绍如何使用Java实现的Ukkonen后缀树构建算法。原创 2015-11-27 13:37:59 · 3274 阅读 · 3 评论 -
JDK并发工具类源码学习系列——PriorityBlockingQueue
PriorityBlockingQueue是一个基于优先级堆的无界的并发安全的优先级队列(FIFO),队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。实现原理PriorityBlockingQueue通过使用堆这种数据结构实现将队列中的元素按照某种排序规则进行排序,从而改变先进先出的队列顺序,提供开发者改变队列中元素的顺序的能力原创 2015-11-20 17:19:55 · 4600 阅读 · 0 评论 -
JDK并发工具类源码学习系列——LinkedBlockingQueue
LinkedBlockingQueue是一个基于已链接节点的、范围任意的 blocking queue。此队列按 FIFO(先进先出)排序元素。队列的头部 是在队列中时间最长的元素。队列的尾部 是在队列中时间最短的元素。新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。原创 2015-11-23 19:04:23 · 1509 阅读 · 0 评论 -
数据结构系列——Trie树
Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。原创 2015-11-23 15:19:37 · 3994 阅读 · 0 评论 -
排序算法系列——冒泡排序
冒泡排序是交换排序的一种,其思想是从序列头部开始逐步往后遍历,每次遍历比较相邻两个元素,如果顺序不对则交换,n-1次遍历之后序列就完成了排序。原创 2015-08-18 11:31:26 · 802 阅读 · 0 评论 -
排序算法系列——堆排序
堆排序同直接选择排序一样是选择排序的一种。堆排序是借助一种数据结构——堆来完成排序,堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 什么是堆: 关于二叉树这里就不叙述了。堆(二叉堆)可以视为一棵完全的二叉树,完全二叉树的一个“优秀”的性质是,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示(普通的一般的二叉树通常用链表作为基本容原创 2015-08-14 18:39:22 · 1024 阅读 · 0 评论 -
FairScheduler job初始化过程源码浅析
上一篇文章说到了jobTracker中的submitJob()方法,这个方法最终会调用listener.jobAdded(job),将Job注册到TaskScheduler中,由其进行调度。今天接着研究。hadoop中默认的TaskScheduler是JobQueueTaskScheduler,采用的是FIFO(先进先出)原则进行调度,还有FiarScheduler和CapacityTaskSch原创 2013-11-21 22:31:59 · 2126 阅读 · 0 评论 -
hadoop job初始化源码浅析
hadoop的job提交过程相对来说还是有点复杂的,所以在学习源码的时候会显得有些乱,时常看了后面忘了前面,所以在看了多遍之后决定用文章的方式记录下来,一边自己下次再看的时候能够清晰些,同时也为初次接触这方面源码的同学提供一些帮助吧。希望自己可以写的足够详细。(本文针对hadoop1.2.1)1.job.waitForCompletion:一般情况下我们提交一个job都是通过job.waitF原创 2013-11-18 23:59:45 · 3115 阅读 · 0 评论 -
Hadoop JobTracker提交job源码浅析
上一篇文章说到jobClient提交job的过程,这篇文章是接着上一篇文章继续写的。上一篇说到jobSubmitClient.submitJob( jobId, submitJobDir.toString(), jobCopy.getCredentials())这里,这里就是jobTracker进行job的提交过程,还有一个JobSubmissionProtocol的实现是LocalJobRu原创 2013-11-20 00:29:19 · 2034 阅读 · 0 评论 -
Spring RMI使用心得
Spring RMI一开始看网上的资料感觉很简单,但一次一次的失败告诉我,那不简单,嘻嘻(当然实现之后还是蛮简单的)。首先我是使用SpringRMI实现两个Web系统之间的通信(其实也就是一个系统调用另一个系统的某个方法),这两个Web系统是部署在一个服务器上的,而且我将rmi的Spring配置文件同我原来的系统的配置文件分开,单独写了一个配置文件(两个系统都是的),这样在服务器启动时就需要加原创 2012-07-17 17:00:09 · 2114 阅读 · 0 评论 -
Abstract Class与Interface的区别
接口和抽象类的区别abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstractclass和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。其转载 2012-05-24 20:19:07 · 913 阅读 · 0 评论 -
Java类加载器
Java类加载器一、 类加载器作用当JVM开始运作时需要使用当某个类时,就需要将对应类的字段吗加载到内存中,而类加载器正式负责加载这些类的工具。另外若果多次重复使用一个类的字节码时加载器不会多次加载,而是使用内存中的字节码。二、 主要的类加载器我们首先看一下JVM预定义的三种类型类加载器,当一个 JVM 启动的时候,Java 缺省开始使用如下三种类型类装入器原创 2012-05-20 22:15:49 · 1597 阅读 · 0 评论 -
Java类之间的关联关系
Java类之间的关联关系UML类图中的关系分为四种:泛化、依赖、关联、实现;关联关系又可以细化为聚合和组合。一、泛化(Generalization)泛化是父类和子类之间的关系,子类继承父类的所有结构和行为。在子类中可以增加新的结构和行为,也可以覆写父类的行为。一般用一个带空心箭头的实线表示泛化关系,UML图如下:泛化对应Java中继承关系,即子类继承父类中出privat原创 2012-05-19 20:43:07 · 25885 阅读 · 4 评论 -
Session的理解
Session的理解一、 个人误区一开始很傻的把Session的会话与用户的登录与退出弄混淆了,实在很傻!Session的会话指的是当你打开浏览器,请求一个应用服务器时开始,直到与这个应用服务器断开连接(如关闭浏览器等)为止的一系列动作。这与用户登录完全没有关系,被弄混淆个人觉得是Session最普遍的用法就是用来控制用户的登录/退出事件的。二、 Session的理解1转载 2012-05-19 00:13:35 · 1528 阅读 · 0 评论 -
Struts2整合Spring方法及原理
一、 Struts 2框架整合Spring步骤1、 复制文件。复制struts2-spring-plugin-x-x-x.jar和spring.jar到WEB-INF/lib目录下。其中的x对应了Spring的版本号。还需要复制commons-logging.jar文件到WEB-INF/lib目录下。2、 配置struts.objectFactory属性值。在struts.proper原创 2012-05-13 14:44:58 · 24093 阅读 · 6 评论 -
Java多线程和同步的理解
Java多线程和同步的理解一、 进程与线程在谈论线程之前,我们先来看看什么叫进程,以及进程与线程的关系。进程我们在windows操作系统中打开任务管理器,可以看到有一项是“进程”,里面列举出了用户目前正在运行的所有进程,包括系统进程和用户应用程序进程,以及每个进程所占用的内存资源等信息。进程是操作系统结构的基础,它不仅只包括运行的程序代码,还包括当前的活动。对于每一个进程原创 2012-05-12 00:41:36 · 1797 阅读 · 0 评论 -
Hadoop1.2.1源码解析系列:JT与TT之间的心跳通信机制——命令篇
简单介绍Hadoop心跳机制中JT对TT下达的五种命令:ReinitTrackerAction,KillTaskAction,KillJobAction,CommitTaskAction,LaunchTaskAction。TT在接收到每个命令时的处理方式都是不一样的,这里简单介绍了每个命令的含义,以及JT如何下达每个命令的,以及TT在接收到命令时的处理方式是什么。原创 2013-12-07 22:17:07 · 2019 阅读 · 0 评论 -
Hadoop1.2.1源码解析系列:JT与TT之间的心跳通信机制——TT篇
JobTracker与TaskTracker之间的通信机制——心跳机制,是MapReduce中一个重要的知识点,了解该方法可以更好地了解JobTracker如何判断一个TaskTracker是否或者,以及如何获取每个TaskTracker的资源使用情况,以及如何为一个TaskTracker分配任务。原创 2013-12-03 23:37:04 · 3366 阅读 · 0 评论 -
排序算法系列——希尔排序
希尔排序同之前介绍的直接插入排序一起属于插入排序的一种。希尔排序算法是按其设计者希尔(Donald Shell)的名字命名,该算法由1959年公布,是插入排序的一种更高效的改进版本。它的作法不是每次一个元素挨一个元素的比较。而是初期选用大跨步(增量较大)间隔比较,使记录跳跃式接近它的排序位置;然后增量缩小;最后增量为 1 ,这样记录移动次数大大减少,提高了排序效率。希尔排序对增量序列的选择没有严格规原创 2015-08-13 10:55:23 · 1031 阅读 · 0 评论 -
一个简单的二叉查找树实现
/** * <p> * 二叉树 * </p> * * @author Vicky * @date 2015-8-10 */class BSTree { private Node root; private int num;// 节点数量 private int index;// 用于遍历 public BSTree() { super(原创 2015-08-10 16:17:49 · 991 阅读 · 0 评论