在前面的源码分析中,很多地方用到了Interrupt,在此,对Interrupt做一个深刻总结。 一、“中断“这个词有误区,它并不是真的中断一个线程,准备说,应该叫做“中断轻量级阻塞”。 什么叫“轻量级阻塞”呢? 就是调…
分类:java并发
Java多线程 -- JUC包源码分析8 -- 对happen before的深刻理解
说到happen before,很多人都知道。但因为其理论的抽象,以及在语义上的微妙,使得对happen before的理解,往往陷入“隔靴搔痒“的境地。本文试图宏观性、多角度的来分析围绕happen before的诸多…
Java多线程 -- JUC包源码分析9 -- AbstractQueuedSynchronizer深入分析-- Semaphore与CountDownLatch
在前面分析ReentrantLock/ReentrantReadWriteLock的时候,我们已经对AQS进行过分析。在初步了解了AQS之后,本篇试图对其进行一个更为系统性的分析。因为AQS是为整个同步框架的基石,不光是…
Java多线程 -- JUC包源码分析10 -- ConcurrentLinkedQueue源码分析
在前面的篇章中,我们详细分析了AQS,并提到了里面一个关键数据结构:所有阻塞线程组成的一个等待队列,这个队列是用单向无锁链表实现的。 今天所讲的ConcurrentLinkedQueue,其实现和AQS中的无锁队列基本一…
Java多线程 -- JUC包源码分析11 -- CyclicBarrier源码分析
在前面的篇章中,讲解了ReentrantLock + Condition,并讲述了2者结合的一个典型应用:ArrayBlockingQueue/LinkedBlockingQueue。 今天讲述2者结合的另一个典型应用:…
Java多线程 -- JUC包源码分析12 -- ThreadPoolExecutor源码分析
在JUC包中,线程池部分本身有很多组件,可以说是前面所分析的各种技术的一个综合应用。从本文开始,将综合前面的知识,逐个分析线程池的各个组件。 –Executor/Executors –Thread…
Java多线程 -- JUC包源码分析13 -- Callable/FutureTask源码分析
关于Runnable,我们都已经很熟悉了。在上一篇,我们也分析了ThreadPoolExecutor用来执行任务的接口execute,如下所示: public interface Runnable { public ab…
Java多线程 -- JUC包源码分析14 -- ScheduledThreadPoolExecutor与DelayQueue源码分析
在前面的篇章中,我们分析了ThreadPoolExecutor,知道了execute和submit的内部实现原理,知道了Runnable/Callable的内在关系。 周期/非周期 AtFixedRate/WithFix…
Java多线程 -- JUC包源码分析15 -- SynchronousQueue与CachedThreadPool
在前面分析工具类Executors的时候,提到了CachedThreadPool:其线程数会无限增大,每来一个新请求,就会new一个Thread,其maxPoolSize = Integer.MAX。 其构造函数如下: …
Java多线程 -- JUC包源码分析16 -- Exchanger源码分析
上一篇所讲的SynchronousQueue,是2个线程之间单向的数据传输,一个put,一个take。 而今天所讲的Exchange,顾明思义,是双向的数据传输,2个线程在一个同步点,交换数据。 其使用方式,大致如下: …
Java多线程 -- JUC包源码分析18 -- ConcurrentSkipListMap(Set)/TreeMap(Set)/无锁链表
–为什么是SkipList,不是TreeMap的红黑树? –无锁链表的精髓 –ConcurrentSkipListMap –ConcurrentSkipListSet 为什…
Java多线程 -- JUC包源码分析19 -- ForkJoinPool/ForkJoinTask
JDK 1.7 提供了一个并行计算的框架,本文就来分析一下它在使用和实现原理上,和ThreadPool有什么区别。 何为Fork/Join? 我们在大学算法课本上,学过的一种基本算法就是:分治。其基本思路就是:把一个大的…