摘要: 在Set中有一个排序的集合SortedSet,用来保存按照自然顺序排列的对象。Queue中同样引入了一个支持排序的FIFO模型。并发队列与Queue简介中介绍了,PriorityQueue和PriorityBlockingQueue就是支持排序的Queue。显然一个支持阻塞的排序Queue要比一个非... 阅读全文
posted @ 2014-12-02 22:22 小光zfg 阅读(212) 评论(0) 推荐(0) 编辑
摘要: 在上一节中详细分析了LinkedBlockingQueue的实现原理。实现一个可扩展的队列通常有两种方式:一种方式就像LinkedBlockingQueue一样使用链表,也就是每一个元素带有下一个元素的引用,这样的队列原生就是可扩展的;另外一种就是通过数组实现,一旦队列的大小达到数组的容量的时候就将... 阅读全文
posted @ 2014-12-02 22:21 小光zfg 阅读(226) 评论(0) 推荐(0) 编辑
摘要: 在《并发容器 part 4 并发队列与Queue简介》节中的类图中可以看到,对于Queue来说,BlockingQueue是主要的线程安全版本。这是一个可阻塞的版本,也就是允许添加/删除元素被阻塞,直到成功为止。BlockingQueue相对于Queue而言增加了两个操作:put/take。下面是一... 阅读全文
posted @ 2014-12-02 22:20 小光zfg 阅读(168) 评论(0) 推荐(0) 编辑
摘要: ConcurrentLinkedQueue是Queue的一个线程安全实现。先来看一段文档说明。一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。新的元素插入到队列的尾部,队列获取操作从队列头... 阅读全文
posted @ 2014-12-02 22:19 小光zfg 阅读(307) 评论(0) 推荐(0) 编辑
摘要: Queue是JDK 5以后引入的新的集合类,它属于Java Collections Framework的成员,在Collection集合中和List/Set是同一级别的接口。通常来讲Queue描述的是一种FIFO的队列,当然不全都是,比如PriorityQueue是按照优先级的顺序(或者说是自然顺序... 阅读全文
posted @ 2014-12-02 22:18 小光zfg 阅读(264) 评论(0) 推荐(0) 编辑
摘要: 在上一篇中介绍了HashMap的原理,这一节是ConcurrentMap的最后一节,所以会完整的介绍ConcurrentHashMap的实现。ConcurrentHashMap原理在读写锁章节部分介绍过一种是用读写锁实现Map的方法。此种方法看起来可以实现Map响应的功能,而且吞吐量也应该不错。但是... 阅读全文
posted @ 2014-12-02 22:17 小光zfg 阅读(172) 评论(0) 推荐(0) 编辑
摘要: 本来想比较全面和深入的谈谈ConcurrentHashMap的,发现网上有很多对HashMap和ConcurrentHashMap分析的文章,因此本小节尽可能的分析其中的细节,少一点理论的东西,多谈谈内部设计的原理和思想。要谈ConcurrentHashMap的构造,就不得不谈HashMap的构造,... 阅读全文
posted @ 2014-12-02 22:16 小光zfg 阅读(215) 评论(0) 推荐(0) 编辑
摘要: 从这一节开始正式进入并发容器的部分,来看看JDK 6带来了哪些并发容器。在JDK 1.4以下只有Vector和Hashtable是线程安全的集合(也称并发容器,Collections.synchronized*系列也可以看作是线程安全的实现)。从JDK 5开始增加了线程安全的Map接口Concurr... 阅读全文
posted @ 2014-12-02 22:15 小光zfg 阅读(184) 评论(0) 推荐(0) 编辑
摘要: 主要谈谈锁的性能以及其它一些理论知识,内容主要的出处是《Java Concurrency in Practice》,结合自己的理解和实际应用对锁机制进行一个小小的总结。首先需要强调的一点是:所有锁(包括内置锁和高级锁)都是有性能消耗的,也就是说在高并发的情况下,由于锁机制带来的上下文切换、资源同步等... 阅读全文
posted @ 2014-12-02 22:11 小光zfg 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 这一节主要是谈谈读写锁的实现。上一节中提到,ReadWriteLock看起来有两个锁:readLock/writeLock。如果真的是两个锁的话,它们之间又是如何相互影响的呢?事实上在ReentrantReadWriteLock里锁的实现是靠java.util.concurrent.locks.Re... 阅读全文
posted @ 2014-12-02 22:10 小光zfg 阅读(222) 评论(0) 推荐(0) 编辑
摘要: 从这一节开始介绍锁里面的最后一个工具:读写锁(ReadWriteLock)。ReentrantLock 实现了标准的互斥操作,也就是一次只能有一个线程持有锁,也即所谓独占锁的概念。前面的章节中一直在强调这个特点。显然这个特点在一定程度上面减低了吞吐量,实际上独占锁是一种保守的锁策略,在这种情况下任何... 阅读全文
posted @ 2014-12-02 22:09 小光zfg 阅读(134) 评论(0) 推荐(0) 编辑
摘要: Semaphore 是一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个acquire(),然后再获取该许可。每个release()添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore只对可用许可的号码进行计数,并采取相应... 阅读全文
posted @ 2014-12-02 22:02 小光zfg 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 如果说CountDownLatch是一次性的,那么CyclicBarrier正好可以循环使用。它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。所谓屏障点就是一组任务执行完毕的时刻。清单1 一个使用CyclicBarrier的例子package xylz.... 阅读全文
posted @ 2014-12-02 22:00 小光zfg 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 此小节介绍几个与锁有关的有用工具。闭锁(Latch)闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态。通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开所有线程都将通过,但是一旦大门打开,所有线程都通过了,那么这个闭锁的状态就失效了,门的状... 阅读全文
posted @ 2014-12-02 21:58 小光zfg 阅读(167) 评论(0) 推荐(0) 编辑
摘要: 本小节介绍锁释放Lock.unlock()。Release/TryReleaseunlock操作实际上就调用了AQS的release操作,释放持有的锁。public final boolean release(int arg) { if (tryRelease(arg)) { Node h = he... 阅读全文
posted @ 2014-12-02 21:57 小光zfg 阅读(172) 评论(0) 推荐(0) 编辑
摘要: 接上篇,这篇从Lock.lock/unlock开始。特别说明在没有特殊情况下所有程序、API、文档都是基于JDK 6.0的。public void java.util.concurrent.locks.ReentrantLock.lock()获取锁。如果该锁没有被另一个线程保持,则获取该锁并立即返回... 阅读全文
posted @ 2014-12-02 21:56 小光zfg 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 在理解J.U.C原理以及锁机制之前,我们来介绍J.U.C框架最核心也是最复杂的一个基础类:java.util.concurrent.locks.AbstractQueuedSynchronizer。AQSAbstractQueuedSynchronizer,简称AQS,是J.U.C最复杂的一个类,导... 阅读全文
posted @ 2014-12-02 21:53 小光zfg 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 前面的章节主要谈谈原子操作,至于与原子操作一些相关的问题或者说陷阱就放到最后的总结篇来整体说明。从这一章开始花少量的篇幅谈谈锁机制。上一个章节中谈到了锁机制,并且针对于原子操作谈了一些相关的概念和设计思想。接下来的文章中,尽可能的深入研究锁机制,并且理解里面的原理和实际应用场合。尽管synchron... 阅读全文
posted @ 2014-12-02 21:52 小光zfg 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁(后面的章节还会谈到锁)。锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等... 阅读全文
posted @ 2014-12-02 21:48 小光zfg 阅读(128) 评论(0) 推荐(0) 编辑
摘要: 在这个小结里面重点讨论原子操作的原理和设计思想。由于在下一个章节中会谈到锁机制,因此此小节中会适当引入锁的概念。在Java Concurrency in Practice中是这样定义线程安全的:当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替运行,并且不需要额外的同步及在调用方... 阅读全文
posted @ 2014-12-02 21:47 小光zfg 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 在这一部分开始讨论数组原子操作和一些其他的原子操作。AtomicIntegerArray/AtomicLongArray/AtomicReferenceArray的API类似,选择有代表性的AtomicIntegerArray来描述这些问题。int get(int i)获取位置i的当前值。很显然,由... 阅读全文
posted @ 2014-12-02 21:46 小光zfg 阅读(247) 评论(0) 推荐(0) 编辑
摘要: 从相对简单的Atomic入手(java.util.concurrent是基于Queue的并发包,而Queue,很多情况下使用到了Atomic操作,因此首先从这里开始)。很多情况下我们只是需要一个简单的、高效的、线程安全的递增递减方案。注意,这里有三个条件:简单,意味着程序员尽可能少的操作底层或者实现... 阅读全文
posted @ 2014-12-02 21:45 小光zfg 阅读(140) 评论(0) 推荐(0) 编辑
摘要: 去年年底有一个Guice的研究计划,可惜由于工作“繁忙”加上实际工作中没有用上导致“无疾而终”,最终只是完成了Guice的初步学习教程,深入的研究没有继续进行下去。最近一直用的比较多的就是java.util.concurrent(J.U.C),实际上这块一直也没有完全深入研究,这次准备花点时间研究下... 阅读全文
posted @ 2014-12-02 21:43 小光zfg 阅读(133) 评论(0) 推荐(0) 编辑
摘要: 这是一份完整的Java 并发整理笔记,记录了我最近几年学习Java并发的一些心得和体会。J.U.C 整体认识原子操作 part 1 从AtomicInteger开始原子操作 part 2 数组、引用的原子操作原子操作 part 3 指令重排序与happens-before法则原子操作 part 4 ... 阅读全文
posted @ 2014-12-02 21:40 小光zfg 阅读(201) 评论(0) 推荐(0) 编辑
摘要: 1、2、重构3、模式4、代码坏味5、模式导向的重构目录6、创建7、简化8、泛化9、保护10、聚集操作11、实用重构 阅读全文
posted @ 2014-11-21 08:55 小光zfg 阅读(131) 评论(0) 推荐(0) 编辑
摘要: SpringMVC中配置URL拦截,非常简单。网上找个示例,就能通过。但是,在我做了好几个Web项目,又参与了别人主导的Web项目时,发现URL配置也非常有学问。1. 先说说一种比较常见的: theDispatcher org.springframework.web.servlet.Dispa... 阅读全文
posted @ 2014-11-15 21:21 小光zfg 阅读(587) 评论(0) 推荐(0) 编辑
摘要: 了解JVM虚拟机原理是每一个Java程序员修炼的必经之路。但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述,很难给人以形象化的认知,看完之后感觉还是稀里糊涂的。感于以上的种种,我打算把我在学习JVM虚拟机的过程中学到... 阅读全文
posted @ 2014-11-15 20:48 小光zfg 阅读(292) 评论(0) 推荐(0) 编辑
摘要: NO1.常量池在class文件的什么位置?我的上一篇文章《Java虚拟机原理图解》 1、class文件基本组织结构中已经提到了class的文件结构,在class文件中的魔数、副版本号、主版本之后,紧接着就是常量池的数据区域了,如下图用红线包括的位置:知道了常量池的位置后,然后让我们来揭秘常量池里究竟... 阅读全文
posted @ 2014-11-15 20:47 小光zfg 阅读(226) 评论(0) 推荐(1) 编辑
摘要: 作为Java程序猿,我们知道,我们写好的.java 源代码,最后会被Java编译器编译成后缀为.class的文件,该类型的文件是由字节组成的文件,又叫字节码文件。那么,class字节码文件里面到底是有什么呢?它又是怎样组织的呢?让我们先来大概了解一下他的组成结构吧。NO1.魔数(magic)... 阅读全文
posted @ 2014-11-15 20:46 小光zfg 阅读(298) 评论(0) 推荐(1) 编辑
摘要: 1、 阅读全文
posted @ 2014-11-09 09:15 小光zfg 阅读(146) 评论(0) 推荐(0) 编辑
摘要: 模式解说 责任链模式是一种对象的行为模式,它将处理客户端请求的那些对象联成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。通常使用在以下场合 1 有多个对象可以处理一个请求,哪个对象处理该请求事先并不知道,而是在运行时自动确定; 2 希望在不明确制定接收者的情况下,向多个对象中的一个提... 阅读全文
posted @ 2014-11-08 14:59 小光zfg 阅读(252) 评论(0) 推荐(0) 编辑
摘要: 一、一个叫声接口和几只鸭子从一个叫声接口开始。{《HeadFirst设计模式》Delphi代码之模式小结}{一个叫声接口}{编译工具:Delphi2010forwin32}{E-Mail:guzh-0417@163.com}unituQuackable;interfacetype IQuackabl... 阅读全文
posted @ 2014-11-05 15:18 小光zfg 阅读(247) 评论(0) 推荐(0) 编辑
摘要: 12{《HeadFirst设计模式》工厂模式之抽象工厂}3{抽象工厂的产品}4{编译工具:Delphi7.0}5{E-Mail:guzh-0417@163.com}67unituPizzaIngredient;89interface1011type12TDough=class(TObject)13e... 阅读全文
posted @ 2014-11-05 15:02 小光zfg 阅读(525) 评论(0) 推荐(0) 编辑
摘要: 12{《HeadFirst设计模式》之组合模式}3{组合与单项的抽象父类}4{编译工具:Delphi2007forwin32}5{E-Mail:guzh-0417@163.com}67unituMenuComponent;89interface1011uses12SysUtils;1314type1... 阅读全文
posted @ 2014-11-05 14:53 小光zfg 阅读(251) 评论(0) 推荐(0) 编辑
摘要: 12{《HeadFirst设计模式》工厂模式之工厂方法}3{产品类}4{编译工具:Delphi2007forwin32}5{联系方式:guzh-0417@163.com}67unituProducts;89interface1011type12{abstractPizza}1314TPizza=cl... 阅读全文
posted @ 2014-11-05 14:44 小光zfg 阅读(529) 评论(0) 推荐(0) 编辑
摘要: 12{《HeadFirst设计模式》之单例模式}3{编译工具:Delphi2007forwin32}4{E-Mail:guzh-0417@163.com}56unituChocolateBoiler;78interface910type11TChocolateBoiler=class(TObject... 阅读全文
posted @ 2014-11-05 14:42 小光zfg 阅读(249) 评论(0) 推荐(0) 编辑
摘要: 简单工厂:工厂依据传进的参数创建相应的产品。12{《HeadFirst设计模式》工厂模式之简单工厂}3{产品类}4{编译工具:Delphi7.0}5{联系方式:guzh-0417@163.com}67unituProducts;89interface1011type12TPizza=class(... 阅读全文
posted @ 2014-11-05 14:41 小光zfg 阅读(212) 评论(0) 推荐(0) 编辑
摘要: 12{《HeadFirst设计模式》之观察者模式}3{主题与观察者}4{编译工具:Delphi7.0}5{联系方式:guzh-0417@163.com}67unituWeatherReport;89interface1011uses12Classes,SysUtils;1314type15TObse... 阅读全文
posted @ 2014-11-05 14:37 小光zfg 阅读(482) 评论(0) 推荐(0) 编辑
摘要: 模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override)。12{《HeadFirst设计模式》之模板方法模式}3{编译工具:Delphi7.0}4{E-Mail:guzh-0417@163.com}56unituCoffeineBeverageWithHook;7... 阅读全文
posted @ 2014-11-05 14:35 小光zfg 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 容器的主要职责有两个:存放元素和浏览元素。根据单一职责原则(SRP)要将二者分开,于是将浏览功能打包封装就有了迭代器。用迭代器封装对动态数组的遍历:12{《HeadFirst设计模式》之迭代器模式}3{容器中的元素类}4{编译工具:Delphi7.0}5{E-Mail:guzh-0417@163... 阅读全文
posted @ 2014-11-05 14:34 小光zfg 阅读(269) 评论(0) 推荐(0) 编辑