摘要: Hamcrest比起JUnit的assert系列方法来,有更好的可读性,它按照参数从左到右的符合自然的顺序来展示,如actual is(notNullValue()),是对测试断言的改进。同时不会被哪个参数是actual,哪个是expect而混淆。除此之外,Hamcrest提供了更丰富的比较方法... 阅读全文
posted @ 2014-12-28 18:52 孟衡 阅读(2649) 评论(0) 推荐(0) 编辑
摘要: 如果不太熟悉MyBatis使用的请先参见MyBatis官方文档,这对理解其架构设计和源码分析有很大好处。一、概述MyBatis并不是一个完整的ORM框架,其官方首页是这么介绍自己The MyBatis data mapper framework makes it easier to use a re... 阅读全文
posted @ 2014-12-28 18:52 孟衡 阅读(106201) 评论(6) 推荐(11) 编辑
摘要: 程序从结构来说由类、函数、包、变量、注释组成,从功能来说由实现类、测试类、依赖管理、打包部署、持续集成组成,从模式来说由架构风格、设计模式组成,这各个方面都是保持代码整洁——可维护的入手点。 函数 1.有准确恰当的命名:通过命名准确地告诉阅读者这个函数做的是什么,且只包括所描述的功能,这... 阅读全文
posted @ 2014-12-28 14:44 孟衡 阅读(2087) 评论(0) 推荐(1) 编辑
摘要: LinkedHashMap特别有意思,它不仅仅是在HashMap上增加Entry的双向链接,它更能借助此特性实现保证Iterator迭代按照插入顺序(以insert模式创建LinkedHashMap)或者实现LRU(Least Recently Used最近最少算法,以access模式创建Linke... 阅读全文
posted @ 2014-04-23 16:07 孟衡 阅读(14422) 评论(0) 推荐(5) 编辑
摘要: Java2中的集合框架是广为人知的,本文打算从几个方面来说说自己对这个框架的理解。 下图是java.util.Collection的类图(基本完整,有些接口如集合类均实现的Cloneable、Serializable没有包含进去) 我们常说要继承的话,到底是写个抽象类还是接口,它们区别在于:如... 阅读全文
posted @ 2014-04-16 21:04 孟衡 阅读(2440) 评论(0) 推荐(3) 编辑
摘要: volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它;我们在JDK及开源框架中随处可见这个关键字,但并发专家又往往建议我们远离它。比如Thread这个很基础的类,其中很重要的线程状态字段,就是用volatile来修饰。如上面所说,并发专家建议我们远离它,尤其是在JDK6的synchronized关键字的性能被大幅优化之后,更是几乎没有使用它的场景,但这仍然是个值得研究的关键字,研究它的意义不在于去使用它,而在于理解它对理解Java的整个多线程的机制是很有帮助的。 阅读全文
posted @ 2013-12-28 17:44 孟衡 阅读(10050) 评论(4) 推荐(2) 编辑
摘要: synchronized关键字是JDK5之实现锁(包括互斥性和可见性)的唯一途径(volatile关键字能保证可见性,但不能保证互斥性,详细参见后文关于vloatile的详述章节),其在字节码上编译为monitorenter和monitorexit这样的JVM层次的原语(原语的意思是这个命令是原子执行的,中间不可中断,详细可查阅原语的概念,这里monitorenter和monitorexit是原语对,表明它们之间的代码段是原子执行的,所以保证了锁机制中的互斥性。如果反编译会发现同步函数的前面加上了monitorenter命令,而在其结束处加上monitorexit命令),JVM通过调用操作系统的互斥原语mutex来实现,被阻塞的线程会被挂起、等待重新调度,也就是如前面“用户态和内核态”章节所说的,在两个态之间来回切换,对性能有较大影响。 阅读全文
posted @ 2013-12-25 20:01 孟衡 阅读(9342) 评论(3) 推荐(1) 编辑
摘要: 在介绍CAS之前,需要先介绍操作系统实现原子性操作的两种方式:总线锁定和缓存一致性.随着多核时代的到来,并发操作已经成了很正常的现象,操作系统必须要有一些机制和原语,以保证某些基本操作的原子性,比如处理器需要保证读一个字节或写一个字节是原子的,那么它是如何实现的呢?有两种机制:总线锁定和缓存一致性。 阅读全文
posted @ 2013-12-25 17:17 孟衡 阅读(10724) 评论(1) 推荐(1) 编辑
摘要: 这一系列多线程的文章,一方面是个人对Java现有的多线程机制的学习和记录,另一方面是希望能给不熟悉Java多线程机制、或有一定基础但理解还不够深的读者一个比较全面的介绍,旨在使读者对Java的多线程有一个递增、全面和较深刻的理解,所以在第一部分就集中介绍一些概念和原理,表面看来这些对多线程的使用没有太多关系,但理解这些概念/原理对理解多线程是至关重要的,因为Java的多线程并非是完全独自实现的,它依赖于操作系统命令、CPU机制,并且随着这些基础软硬件的发展而发展,所以请有意向对多线程全面理解的读者,请耐心地一篇一篇地看完,我尽量在介绍的过程中给予足够而又简单的介绍,如果不能理解,请查阅操作系统及CPU方面的资料。 阅读全文
posted @ 2013-12-25 14:52 孟衡 阅读(11055) 评论(0) 推荐(2) 编辑