- 浏览: 254365 次
- 性别:
- 来自: 北京
博客专栏
-
Java并发包源码解析
浏览量:100311
最新评论
-
746238836:
整个RingBuffer内部做了大量的缓存行填充,前后各填充了 ...
disruptor-3.3.2源码解析(2)-队列 -
xiangshouxiyang:
群加不了。。。
Jdk1.7 ForkJoin框架源码解析汇总 -
有贝无患:
acquire方法里面为什么tryAcquire会被调用多次 ...
Jdk1.6 JUC源码解析(6)-locks-AbstractQueuedSynchronizer -
zwy_qz:
library_call.cpp 里面的内联操作 inline ...
Jdk1.6 JUC源码解析(1)-atomic-AtomicXXX -
sunwang810812:
您好,正在学习您的文章,中间有一段,一直没明白:“privat ...
Jdk1.6 JUC源码解析(6)-locks-AbstractQueuedSynchronizer
文章列表
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 ...