`
BrokenDreams
  • 浏览: 254365 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
68ec41aa-0ce6-3f83-961b-5aa541d59e48
Java并发包源码解析
浏览量:100311
社区版块
存档分类
最新评论
文章列表
Jdk1.7 JUC源码增量解析(1)-FutureTask 作者:大飞   功能简介: FutureTask是一种异步任务(或异步计算),举个栗子,主线程的逻辑中需要使用某个值,但这个值需要负责的运算得来,那么主线程可以提前建立一个异步任务来计算这个值(在其他的线程中计算),然后去做其他事情,当需要这个值的时候再通过刚才建立的异步任务来获取这个值,有点并行的意思,这样可以缩短整个主线程逻辑的执行时间。 与1.6版本不同,1.7的FutureTask不再基于AQS来构建,而是在内部采用简单的Treiber Stack来保存等待线程。 源码分析: 老规矩,先看内部结 ...
Java与IEEE754浅浅谈 作者:大飞   怎么用二进制来表示小数呢?        假设我们要用二进制来表示小数5.5,怎么搞?               按照常规思路,首先用二进制表示一下5,是101,那5.5岂不就是101.101(呵呵哒...)。   ...
disruptor-3.3.2源码解析(5)-框架支持 作者:大飞   更方便的使用Disruptor:        前面几篇看了Disruptor中的一些重要组件和组件的运行方式,也通过手动组合这些组件的方式给出了一些基本的用例。框架也提供了一个DSL-style API,来帮助我们更容易的使用框架,屏蔽掉一些细节(比如怎么构建RingBuffer、怎么关联追踪序列等),相当于Builder模式。        在看Disruptor之前,先看一些辅助类,首先看下ConsumerRepository: class ConsumerRepository<T ...
disruptor-3.3.2源码解析(4)-处理事件 作者:大飞   Disruptor中如何处理事件:        disruptor中提供了专门的事件处理器接口,先看下接口定义: /** * 事件处理器会等待RingBuffer中的事件变为可用(可处理),然后处理可用的事件。 * 一个事件处理器通常会关联一个线程。 */ public interface EventProcessor extends Runnable{ /** * 获取一个事件处理器使用的序列引用。 */ Sequence getSe ...
disruptor-3.3.2源码解析(3)-发布事件 作者:大飞   Disruptor中如何发布事件:        前面两篇看了disruptor中的序列和队列,这篇说一下怎么往RingBuffer中发布事件。这里也需要明确一下,和一般的生产者/消费者模式不同(如果以生产者/消费者的模式来看待disruptor的话),disruptor中队列里面的数据一般称为事件,RingBuffer中提供了发布事件的方法,另外也提供了专门的处理事件的类。        其实在disruptor中,RingBuffer也提供了一部分生产的功能,里面提供了大量的发布事件的方法。 ...
disruptor-3.3.2源码解析(2)-队列 作者:大飞   Disruptor中的队列-RingBuffer:        RingBuffer是disruptor最重要的核心组件,如果以生产者/消费者模式来看待disruptor框架的话,那RingBuffer就是生产者和消费者的工作队列了。RingBuffer可以理解为是一个环形队列,那内部是怎么实现的呢?看下源码。          首先,RingBuffer实现了一系列接口,Cursored、EventSequencer和EventSink,Cursored上篇提过了,这里看下后面两个: pub ...
disruptor-3.3.2源码解析(1)-序列 作者:大飞   Disruptor中的序列-Sequence:        disruptor中较为重要的一个类是Sequence。我们设想下,在disruptor运行过程中,事件发布者(生产者)和事件处理者(消费者)在ringbuffer上相互追逐,由什么来标记它们的相对位置呢?它们根据什么从ringbuffer上发布或者处理事件呢?就是这个Sequence-序列。        我们看一下这个类的源代码,先看结构: class LhsPadding{ protected long p1, p2, ...
Jdk1.6 JUC源码解析(27)-Exchanger 作者:大飞   功能简介: Exchanger是一种线程间安全交换数据的机制。可以和之前分析过的SynchronousQueue对比一下:线程A通过SynchronousQueue将数据a交给线程B;线程A通过Exchanger和线程B交换数据,线程A把数据a交给线程B,同时线程B把数据b交给线程A。可见,SynchronousQueue是交给一个数据,Exchanger是交换两个数据。   源码分析: 先看下内部结构: private static final class Node extend ...
Jdk1.6 JUC源码解析(26)-ConcurrentSkipListMap、ConcurrentSkipListSet 作者:大飞   功能简介: ConcurrentSkipListMap是一种线程安全的有序的Map。一般我们使用有序Map,不要求线程安全的情况下,可以使用TreeMap,要求线程安全的话,就可以使用ConcurrentSkipListMap。 ConcurrentSkipListMap内部的数据结构是SkipList(跳表),内部Entry顺序是由实现了Comparable的key或者构造时指定的Comparator来保证。和TreeMap一样,对C ...
Jdk1.6 JUC源码解析(25)-ConcurrentHashMap 作者:大飞   功能简介: ConcurrentHashMap是一种线程安全的HashMap。相对于HashTable和Collections.synchronizedMap(),ConcurrentHashMap具有更好的性能和伸缩性,是由于其使用了分段锁的策略,将内部数 ...
Jdk1.6 JUC源码解析(24)-ConcurrentLinkedQueue 作者:大飞   功能简介: ConcurrentLinkedQueue是一种基于单向链表实现的无界的线程安全队列。队列中的元素遵循先入先出(FIFO)的规则。新元素插入到队列的尾部,从队列头部取出元素。 ConcurrentLinkedQueue内部采用一种wait-free(无等待)算法来实现。   源码分析: 首先看下内部结构: public class ConcurrentLinkedQueue<E> extends AbstractQueue<E> ...
Jdk1.6 JUC源码解析(23)-CopyOnWriteArrayList、CopyOnWriteArraySet 作者:大飞   功能简介: CopyOnWriteArrayList是一种线程安全的ArrayList。顾名思义,有写操作时,就会copy一个新的内部数组出来替换掉旧的数组。这样做的好处是,遍历操 ...
Jdk1.6 JUC源码解析(22)-LinkedBlockingDeque 作者:大飞   功能简介: LinkedBlockingDeque是一种基于双向链表实现的有界的(可选的,不指定默认int最大值)阻塞双端队列。        双端队列一般适用于工作密取模式,即每个消费者都拥有自己的双端队列,如果某个消费者完成了自己队列的全部任务,可以到其他消费者双端队列尾部秘密获取任务来处理。   源码分析: LinkedBlockingDeque实现了BlockingDeque接口,简单看下这个接口:   public interface Blocking ...
Jdk1.6 JUC源码解析(21)-ExecutorCompletionService 作者:大飞   功能简介: ExecutorCompletionService用于执行一批任务,然后按照任务执行完成的顺序来获取任务结果。你甚至可以在获取到了若干个执行结果后,把其他的任务取消掉(Threa ...
Jdk1.6 JUC源码解析(20)-Executors 作者:大飞   功能简介: Executors是JUC包提供的一个工具性质的帮助类,它针对ExecutorService、ScheduledExecutorService、ThreadFactory和Callable提供了一系列工厂方法和工具方法。 源码分析: 首先看下针对ExecutorService提供的一些工厂方法:   public static ExecutorService newFixedThreadPool(int nThreads) { return new T ...
Global site tag (gtag.js) - Google Analytics