JUC源码系列
文章平均质量分 84
熊猫小牛牛
这个作者很懒,什么都没留下…
展开
-
JUC源码分析9-locks-ReentrantLock
ReentrantLock可重入锁,使用比synchronized方便灵活,可作为替代使用:1.支持公平/不公平锁;2.支持响应超时,响应中断;3.支持condition;ReentrantLock实现了Lock接口,内部使用static类继承AQS实现独占式的api来实现这些功能,使用AQS的state来表示锁可重入次数:之前学习AQS的时候说过请求和rele原创 2016-05-10 16:14:24 · 1077 阅读 · 0 评论 -
JUC源码分析21-队列-LinkedBlockingDeque
LinkedBlockingDeque基于双向链表实现的阻塞队列,根据构造传入的容量大小决定有界还是无界,默认不传的话,大小Integer.Max。实现BlockingDequeue接口,这个接口继承BlockingQueue和Dequeue,看下接口方法:public interface BlockingDeque extends BlockingQueue, Deque { /**原创 2016-07-12 15:51:24 · 1040 阅读 · 0 评论 -
JUC源码分析22-队列-SynchronousQueue
SynchronousQueue是一种比较特殊的阻塞队列,不同于之前的阻塞队列,特点为:1.每次put必须有take的存在,也就是说生产者将一个元素put传递给一个消费者,消费者不存在就put不成功;2.内部没有容量来维持存放元素,所以size,迭代等一些方法没有意义;3.使用cas操作,没有使用锁;4.通过栈(非公平),队(列公平)2中结构来支持公平\非公平策略。newC原创 2016-07-26 17:06:44 · 734 阅读 · 0 评论 -
JUC源码分析17-队列-ArrayBlockingQueue
看ArrayBlockingQueue的javadoc说明,简单翻译过来:1.基于数组实现的有界阻塞队列,队列采用FIFO;2.因为基于数组,所以队列创建后大小不能改变。线程在插入元素到一个满的队列时会阻塞,线程获取元素时,队列为空也会阻塞;3.对于队列的生产和消费线程提供了公平非公平策略。ArrayBlockingQueue继承AbstractQueue抽象类,实现了Blocki原创 2016-07-06 14:33:05 · 426 阅读 · 0 评论 -
JUC源码分析18-队列-LinkedBlockingQueue
LinkedBlockingQueue是基于单向链表实现的有界阻塞队列,队列元素遵循FIFO,LinkedBlockingQueue比基于数组的阻塞队列拥有更好的吞吐量,但是在大部分并发应用中,性能不如基于数组的队列。和ArrayBlocingQueue一样继承AbstractQueue,实现BlockingQueue接口,不再看BlockingQueue接口代码,直接看LinkedBlock原创 2016-07-06 18:05:38 · 597 阅读 · 0 评论 -
JUC源码分析16-集合-ConcurrentSkipListMap、ConcurrentSkipListSet
NBA这赛季结束,勇士可惜啊,谁能想到没拿到冠军,库昊也没成为真正的老大,lbl一战封神,所有口水留言都变成羡慕嫉妒恨,哎,我库啊,还是还是看书吧。ConcurrentSkipListMap说实话,之前还真没注意过,还是看JUC才看到,利用skiplist跳表结构来实现一种有序的map,之前看到的map都是无序。在学习前还是要好好了解下什么是skiplist跳表,的确很不错,利用空间换时间,复原创 2016-06-23 10:12:34 · 3782 阅读 · 0 评论 -
JUC源码分析19-队列-PriorityBlockingQueue
PriorityBlockingQueue是一个基于数组实现的线程安全的无界队列,原理和内部结构跟PriorityQueue基本一样,只是多了个线程安全。javadoc里面提到一句,1:理论上是无界的,所以添加元素可能导致outofmemoryerror;2.不容许添加null;3.添加的元素使用构造时候传入Comparator排序,要不然就使用元素的自然排序。PriorityBlocking原创 2016-07-08 18:49:02 · 2099 阅读 · 0 评论 -
JUC源码分析23-队列-ConcurrentLinkedQueue
之前看的队列大都是基于锁来实现阻塞,ConcurrentLinkedQueue采用wait-free算法来实现'无锁'的并发队列。wait-free算法之前没听说过,只听过lock-free,大牛解析说2中不同,具体看参考,有空后面翻译下。ConcurrentLinkedQueue基于单向链表实现线程安全的无界队列。队列元素遵循FIFO。看下队列内部结构:/*** Node节点,一个原创 2016-08-01 17:38:32 · 706 阅读 · 0 评论 -
JUC源码分析24-队列-CopyOnWriteArrayList,CopyOnWriteArraySet
在看LinkedTransferQueue之前看个简单点的CopyOnWriteArrayList。CopyOnWriteArrayList还是比较简单的,内部结构只有一个数组和一把锁。采用写时加锁复制数组,所有的可变操作都在新数组上进行,读则是老数组,有点读写分离意思,比ArrayList都加锁开肯定好的多,感觉适合那种读多写少的场景。内部结构只有一个重入锁,一个数组:/** The l原创 2016-08-05 10:48:00 · 480 阅读 · 0 评论 -
JUC源码分析25-队列-LinkedTransferQueue
原理TransferQueueLinkedTransferQueue结构-NodeNode节点Node节点源码LinkedTransferQueue结构源码核心方法put-offer-adduntimed poll-tryTransfertransfer-take超时的poll-tryTransfer核心xfer其他辅助方法Example 前端妹子推荐Markdown排原创 2016-08-18 15:23:33 · 2346 阅读 · 0 评论 -
JUC源码分析26-线程池-ThreadPoolExecutor
功能说明类图预热ExecutorExecutorServiceAbstractExecutorServiceThreadPoolExecutor线程池状态ThreadPoolExecutor大致结构核心代码流程executeaddWorkerWorkerrunWorkergetTaskprocessWorkerExitaddWorkerFailedtryTermin原创 2016-08-29 17:14:41 · 2833 阅读 · 3 评论 -
JUC源码分析27-线程池-FutureTask
结构核心方法runcancelgetawaitDone其他方法总结参考在前一篇ThreadPoolExecutor学习时,在AbstractExecutorService代码重看到submit一个任务时,利用FutureTask的来封装提交的任务。这也应该是FutureTask最正常的使用吧。 如果对Future不了解的,有本书《java多线程设计模式》,真心是本好书,只是翻译的比原创 2016-09-12 10:08:00 · 870 阅读 · 0 评论 -
JUC源码分析28-线程池-ExecutorCompletionService
CompletionService源码之前在看AbstractExecutorService的doInvokeAny()时看到这样的代码:ExecutorCompletionService<T> ecs = new ExecutorCompletionService<T>(this);.....futures.add(ecs.submit(it.next()));....ecs.t原创 2016-09-12 15:16:09 · 459 阅读 · 0 评论 -
JUC源码分析30-线程池-Exchanger
Demo算法原理结构调用方法exchangedoExchangehashIndexcreateSlotawaittryCancelspinWait总结本想JUC最后一节写下Executors的,然后结束JUC。看了下代码,完全是一个工具类,哎,都是ThreadPoolExecutor、ScheduledThreadPoolExecutor还有callable的封装,代码看起来也原创 2016-10-09 17:50:13 · 714 阅读 · 0 评论 -
JUC源码分析20-队列-DelayQueue
画个JUC阻塞队列的类关系图,之前都没在意,画一下感觉会清楚很多DelayQueue是无界的阻塞队列,其特点是实现队列元素的延迟出队,通俗点说就是队列元素可以设置延迟时间,时间不到,就待在队列中,很有意思的东西,感觉跟redis设置过期时间一样。队列元素不容许添加null元素。DelayQueue可以用来实现调度的定时任务或者缓存的过期。添加的队列元素必须实现Delayed接口:原创 2016-07-11 18:03:04 · 906 阅读 · 0 评论 -
JUC源码分析15-集合-ConcurrentHashMap
好几天没看juc了,之前看了HashMap,还有个差不多的HashTable,二者的结构大致相同,小小的比较下2者的不同:1.HashMap是非线程安全的,HashTable通过synchronized加锁实现线程安全。如果我们的代码里存在{get();...;put()}这种操作的话就保证不了;2.HashMap可以存储key或value为null的值,HashTable不行;3.初原创 2016-06-06 20:04:23 · 1883 阅读 · 0 评论 -
JUC源码分析8-locks-AQS-condition
AQS的conditionObject实现类似object的wait/notify/notify的功能,功能大概是:1.object维护一个监视器和一个等待队列,condition对于一个lock可以有多个condition,对于每个condition维护一个条件队列;2.提供wait/signal/signalall功能。来个入门demo:public class Conditi原创 2016-05-10 11:57:54 · 1521 阅读 · 1 评论 -
JUC源码分析10-locks-CountDownLatch
上一次学习了ReetrantLock,是对AQS独占模式的,这次学习CountDownLatch,是共享模式api的实现。人生不死,学无止境。先看个demo吧:import java.util.concurrent.CountDownLatch;public class CountDownLatchTest { private static CountDownLatch原创 2016-05-11 09:55:24 · 811 阅读 · 0 评论 -
JUC源码分析11-locks-Semaphore
Semaphore不明白为什么直接放在juc包下,不是应该放locks下面嘛,这里还是当初locks学习吧。Semaphore英文是信号量的意思,在这里我喜欢叫资源或者许可,实现的功能就是获取资源,获取到就干活,获取不到就排队,等别人释放了资源,然后所有排队的再去获取。实现AQS的共享api,看个入门demo:public class SemaphoreTest { //3个原创 2016-05-11 17:37:24 · 521 阅读 · 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原创 2016-05-13 09:53:18 · 434 阅读 · 0 评论 -
JUC源码分析2-原子变量-AtomicIntegerArray/AtomicLongArray/AtomicReferenceArray
JUC针对数组元素的原子封装,先看AtomicIntegerArray。private static final Unsafe unsafe = Unsafe.getUnsafe();//arrayBaseOffset获取数组首个元素地址偏移private static final int base = unsafe.arrayBaseOffset(int[].class);//shif原创 2016-04-29 11:57:17 · 1010 阅读 · 1 评论 -
JUC源码分析3-原子变量-AtomicIntegerFieldUpdater/AtomicLongFieldUpdater/AtomicReferenceFieldUpdater
如果我们系统中已经有某个类的变量定义为volatile了,现在为了保证对这个变量的原子性操作,就可以尝试使用这几个类,举个栗子:import sun.reflect.Reflection;public class AtomicFieldIncr { //这里最好是public volatile,不要加final、static //修饰符最好也不要为protected,pr原创 2016-04-29 17:09:59 · 1675 阅读 · 0 评论 -
JUC源码分析4-原子变量-AtomicStampedReference/AtomicMarkableReference
之前讲过的AtomicInteger等CAS操作会产生ABA问题,什么是ABA?wiki官方解释https://en.wikipedia.org/wiki/ABA_problem,简单讲就是多线程环境,2次读写中一个线程修改A->B,然后又B->A,另一个线程看到的值未改变,又继续修改成自己的期望值。如果我们不关心中间状态的变化,只关心最终结果,就无所谓ABA问题。看代码:import jav原创 2016-05-04 10:12:11 · 1636 阅读 · 0 评论 -
JUC源码分析5-locks-LockSupport
LockSupport通过unsafe提供阻塞和唤醒线程的方法,AQS和其他的lock都会使用到这个基础类。private LockSupport() {} // Cannot be instantiated.private static final Unsafe unsafe = Unsafe.getUnsafe();private static final long parkBl原创 2016-05-04 11:58:53 · 753 阅读 · 0 评论 -
JUC源码分析6-locks-AQS-独占模式
AbstractQueuedSynchronizer(下面简称AQS),javadoc说明: Provides a framework for implementing blocking locks and related synchronizers (semaphores, events, etc) that rely on first-in-first-out (FIFO) wait que原创 2016-05-06 14:05:26 · 1301 阅读 · 0 评论 -
JUC源码分析7-locks-AQS-共享模式
AQS中一定要记住2点:1.处理流程:if(!请求成功)加入队列2.请求是对state的判断,AQS不关心你state表示什么,你可以表示状态也可以表示数量,由子类实现对请求的判断。将规则的判断和规则的处理分离,有点像模板模式。先想想什么是独占什么是共享,举个栗子:独占就像大家拿号去排队体检,你拿号了发现前面还有n个人,没办法,等吧,然后你前面的人体检完了,医生就说,你通知下一原创 2016-05-06 17:42:17 · 2000 阅读 · 1 评论 -
JUC源码分析13-locks-ReentrantReadWriteLock
ReentrantReadWriteLock基于AQS实现读写锁的同步:1.利用共享模式实现读锁,独占模式实现写锁;2.支持公平和非公平,非公平的情况下可能会出现读锁阻塞写锁的场景;3.写锁阻塞写锁和读锁,读锁阻塞写锁;4.写锁可以降级为读锁,读锁不能升级为写锁,只能先release再lock;5.写锁支持condition条件;6.读写锁都支持超时/中断lock;原创 2016-05-18 11:23:40 · 2985 阅读 · 0 评论 -
JUC源码分析1-原子变量-AtomicInteger/AtomicBoolean/AtomicLong/AtomicReference
记录学习中的一些东西,防止以后遗忘,参考了很多别人的文章,感谢之!多线程并发操作时,对普通变量++或--不具有原子性,每次读取的值都不一样,看代码:import java.util.concurrent.atomic.AtomicInteger;public class Incr { public AtomicInteger a = new AtomicInteger原创 2016-04-28 19:43:25 · 1395 阅读 · 0 评论 -
JUC源码分析14-集合-HashMap
在学习juc并发集合前先看了下HashMap,听说好多面试会问这个,没遇见过,学习下吧。学习的jdk源码一直都是1.7版本的,其他版本可能有些微不同,应该也不影响学习。HashMap有几点需要记得吧:1.是非线程安全的:javadoc说明:可以通过Map m = Collections.synchronizedMap(new HashMap(...));解决,或者干脆用juc里面Concu原创 2016-05-20 12:04:17 · 4081 阅读 · 0 评论 -
JUC源码分析29-线程池-ScheduledThreadPoolExecutor
ScheduledExecutorService基本结构和构造流程4个schedule调度ScheduledFutureTask接口的几个实现方法DelayedWorkQueue第一次看到这个还是在netty源码中,可惜netty没有坚持看完,后来在工作中,原来公司框架的esb下发消息,jms不能做到可配置的启停,后来使用这个做了个监听,配合统一配置平台完成心跳,实现在项目发布期间,可以原创 2016-09-27 17:03:04 · 1029 阅读 · 0 评论