关闭

JUC源码分析30-线程池-Exchanger

Demo 算法原理 结构 调用方法 exchange doExchange hashIndex createSlot await tryCancel spinWait 总结本想JUC最后一节写下Executors的,然后结束JUC。看了下代码,完全是一个工具类,哎,都是ThreadPoolExecutor、ScheduledThreadPoolExecutor还有callable的封装,代码看起来也...
阅读(284) 评论(0)

JUC源码分析29-线程池-ScheduledThreadPoolExecutor

ScheduledExecutorService 基本结构和构造 流程 4个schedule调度 ScheduledFutureTask 接口的几个实现方法 DelayedWorkQueue第一次看到这个还是在netty源码中,可惜netty没有坚持看完,后来在工作中,原来公司框架的esb下发消息,jms不能做到可配置的启停,后来使用这个做了个监听,配合统一配置平台完成心跳,实现在项目发布期间,可以...
阅读(210) 评论(0)

JUC源码分析28-线程池-ExecutorCompletionService

CompletionService 源码之前在看AbstractExecutorService的doInvokeAny()时看到这样的代码:ExecutorCompletionService ecs = new ExecutorCompletionService(this); ..... futures.add(ecs.submit(it.next())); .... ecs.t...
阅读(174) 评论(0)

JUC源码分析27-线程池-FutureTask

结构 核心方法 run cancel get awaitDone 其他方法 总结 参考在前一篇ThreadPoolExecutor学习时,在AbstractExecutorService代码重看到submit一个任务时,利用FutureTask的来封装提交的任务。这也应该是FutureTask最正常的使用吧。 如果对Future不了解的,有本书《java多线程设计模式》,真心是本好书,只是翻译的比...
阅读(433) 评论(0)

JUC源码分析26-线程池-ThreadPoolExecutor

功能说明 类图 预热 Executor ExecutorService AbstractExecutorService ThreadPoolExecutor 线程池状态 ThreadPoolExecutor大致结构 核心代码流程 execute addWorker Worker runWorker getTask processWorkerExit addWorkerFailed tryTermin...
阅读(778) 评论(3)

JUC源码分析25-队列-LinkedTransferQueue

原理 TransferQueue LinkedTransferQueue结构-Node Node节点 Node节点源码 LinkedTransferQueue结构源码 核心方法 put-offer-add untimed poll-tryTransfer transfer-take 超时的poll-tryTransfer 核心xfer 其他辅助方法 Example 前端妹子推荐Markdown排...
阅读(720) 评论(0)

JUC源码分析24-队列-CopyOnWriteArrayList,CopyOnWriteArraySet

在看LinkedTransferQueue之前看个简单点的CopyOnWriteArrayList。CopyOnWriteArrayList还是比较简单的,内部结构只有一个数组和一把锁。采用写时加锁复制数组,所有的可变操作都在新数组上进行,读则是老数组,有点读写分离意思,比ArrayList都加锁开肯定好的多,感觉适合那种读多写少的场景。 内部结构只有一个重入锁,一个数组: /** The l...
阅读(204) 评论(0)

JUC源码分析23-队列-ConcurrentLinkedQueue

之前看的队列大都是基于锁来实现阻塞,ConcurrentLinkedQueue采用wait-free算法来实现'无锁'的并发队列。wait-free算法之前没听说过,只听过lock-free,大牛解析说2中不同,具体看参考,有空后面翻译下。 ConcurrentLinkedQueue基于单向链表实现线程安全的无界队列。队列元素遵循FIFO。 看下队列内部结构: /** * Node节点,一个...
阅读(380) 评论(0)

JUC源码分析22-队列-SynchronousQueue

SynchronousQueue是一种比较特殊的阻塞队列,不同于之前的阻塞队列,特点为: 1.每次put必须有take的存在,也就是说生产者将一个元素put传递给一个消费者,消费者不存在就put不成功; 2.内部没有容量来维持存放元素,所以size,迭代等一些方法没有意义; 3.使用cas操作,没有使用锁; 4.通过栈(非公平),队(列公平)2中结构来支持公平\非公平策略。 newC...
阅读(355) 评论(0)

JUC源码分析21-队列-LinkedBlockingDeque

LinkedBlockingDeque基于双向链表实现的阻塞队列,根据构造传入的容量大小决定有界还是无界,默认不传的话,大小Integer.Max。 实现BlockingDequeue接口,这个接口继承BlockingQueue和Dequeue,看下接口方法: public interface BlockingDeque extends BlockingQueue, Deque { /** ...
阅读(627) 评论(0)

JUC源码分析20-队列-DelayQueue

画个JUC阻塞队列的类关系图,之前都没在意,画一下感觉会清楚很多 DelayQueue是无界的阻塞队列,其特点是实现队列元素的延迟出队,通俗点说就是队列元素可以设置延迟时间,时间不到,就待在队列中,很有意思的东西,感觉跟redis设置过期时间一样。队列元素不容许添加null元素。DelayQueue可以用来实现调度的定时任务或者缓存的过期。 添加的队列元素必须实现Delayed接口: ...
阅读(352) 评论(0)

JUC源码分析19-队列-PriorityBlockingQueue

PriorityBlockingQueue是一个基于数组实现的线程安全的无界队列,原理和内部结构跟PriorityQueue基本一样,只是多了个线程安全。javadoc里面提到一句,1:理论上是无界的,所以添加元素可能导致outofmemoryerror;2.不容许添加null;3.添加的元素使用构造时候传入Comparator排序,要不然就使用元素的自然排序。 PriorityBlocking...
阅读(1333) 评论(0)

JUC源码分析18-队列-LinkedBlockingQueue

LinkedBlockingQueue是基于单向链表实现的有界阻塞队列,队列元素遵循FIFO,LinkedBlockingQueue比基于数组的阻塞队列拥有更好的吞吐量,但是在大部分并发应用中,性能不如基于数组的队列。 和ArrayBlocingQueue一样继承AbstractQueue,实现BlockingQueue接口,不再看BlockingQueue接口代码,直接看LinkedBlock...
阅读(192) 评论(0)

JUC源码分析17-队列-ArrayBlockingQueue

看ArrayBlockingQueue的javadoc说明,简单翻译过来: 1.基于数组实现的有界阻塞队列,队列采用FIFO; 2.因为基于数组,所以队列创建后大小不能改变。线程在插入元素到一个满的队列时会阻塞,线程获取元素时,队列为空也会阻塞; 3.对于队列的生产和消费线程提供了公平非公平策略。 ArrayBlockingQueue继承AbstractQueue抽象类,实现了Blocki...
阅读(176) 评论(0)

JUC源码分析16-集合-ConcurrentSkipListMap、ConcurrentSkipListSet

NBA这赛季结束,勇士可惜啊,谁能想到没拿到冠军,库昊也没成为真正的老大,lbl一战封神,所有口水留言都变成羡慕嫉妒恨,哎,我库啊,还是还是看书吧。 ConcurrentSkipListMap说实话,之前还真没注意过,还是看JUC才看到,利用skiplist跳表结构来实现一种有序的map,之前看到的map都是无序。在学习前还是要好好了解下什么是skiplist跳表,的确很不错,利用空间换时间,复...
阅读(1364) 评论(0)

JUC源码分析15-集合-ConcurrentHashMap

好几天没看juc了,之前看了HashMap,还有个差不多的HashTable,二者的结构大致相同,小小的比较下2者的不同: 1.HashMap是非线程安全的,HashTable通过synchronized加锁实现线程安全。如果我们的代码里存在{get();...;put()}这种操作的话就保证不了; 2.HashMap可以存储key或value为null的值,HashTable不行; 3.初...
阅读(1280) 评论(0)

JUC源码分析14-集合-HashMap

在学习juc并发集合前先看了下HashMap,听说好多面试会问这个,没遇见过,学习下吧。学习的jdk源码一直都是1.7版本的,其他版本可能有些微不同,应该也不影响学习。 HashMap有几点需要记得吧: 1.是非线程安全的:javadoc说明:可以通过Map m = Collections.synchronizedMap(new HashMap(...));解决,或者干脆用juc里面Concu...
阅读(3531) 评论(0)

JUC源码分析13-locks-ReentrantReadWriteLock

ReentrantReadWriteLock基于AQS实现读写锁的同步: 1.利用共享模式实现读锁,独占模式实现写锁; 2.支持公平和非公平,非公平的情况下可能会出现读锁阻塞写锁的场景; 3.写锁阻塞写锁和读锁,读锁阻塞写锁; 4.写锁可以降级为读锁,读锁不能升级为写锁,只能先release再lock; 5.写锁支持condition条件; 6.读写锁都支持超时/中断lock; ...
阅读(2530) 评论(0)

JUC源码分析12-locks-CyclicBarrier

CyclicBarrier字面意思是可循环栅栏,看javadoc的帮助A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point. CyclicBarriers are useful in programs involving a fi...
阅读(191) 评论(0)

JUC源码分析11-locks-Semaphore

Semaphore不明白为什么直接放在juc包下,不是应该放locks下面嘛,这里还是当初locks学习吧。 Semaphore英文是信号量的意思,在这里我喜欢叫资源或者许可,实现的功能就是获取资源,获取到就干活,获取不到就排队,等别人释放了资源,然后所有排队的再去获取。实现AQS的共享api,看个入门demo: public class SemaphoreTest { //3个...
阅读(256) 评论(0)
30条 共2页1 2 下一页 尾页
    个人资料
    • 访问:62401次
    • 积分:1347
    • 等级:
    • 排名:千里之外
    • 原创:62篇
    • 转载:72篇
    • 译文:1篇
    • 评论:15条
    最新评论