
源码
吃琛了
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
JUC源码解析九:基本数据类型的原子类
一、AtomicInteger如果你学过JVM内存模型你应该知道原子性以及可见性的概念,在对于一个基本类型的修改中,上述两种原则体现在:一个参数的自增操作其实使用了三条原句方才完成,而在并发条件下,在微观下你不能够保证三条原句能够依次执行而中间没有插入对该参数的其他修改操作。一个字段需要将高速缓存块中的数据刷新到内存中并且使其他CPU高速缓存行中的相应数据失效。想要详细了解的可以了解下...原创 2019-04-26 12:32:55 · 325 阅读 · 0 评论 -
JUC源码解析八:ReentrantReadWriterLock读写锁源码解析
一 前言ReentrantReadWriterLock这个类顾名思义就是一个同时支持读锁与写锁的可重入类。跟ReentrantLock相比不仅多了读锁的可共享锁,还对读与写进行了分类,在内部对其进行协调(读锁升级为写锁、写锁降级为读锁)。另外读写锁最多支持2^16-1个递归写入锁和2^16-1个递归读取锁,相比ReentrantLock的2^32-1少了很多,原因则是ReentrantReadW...原创 2019-04-10 00:49:56 · 328 阅读 · 0 评论 -
JUC源码解析五:Latch——闭锁
一 前言闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态。可以想象一下在高铁开始验票之前,所有的闸机都是关闭的。这时候把关闭状态的闸机想象成一条被阻塞的线程。当开始验票的时候,所有的闸机也就是线程都被打开唤醒了。而一次验票是一次性的,当闭锁打开之后这个闭锁的状态也就失效了。针对与闭锁在Java中我们常用的是一个CountDownLatch的类,它允许一个或者多个线程...原创 2019-04-03 13:02:16 · 497 阅读 · 0 评论 -
JUC源码解析二:unlock()方法的层层剥析
一、前言本次我们以ReentrantLock类来讲解一下unlock()方法的调用。首先我们要清楚RentrantLock是一个独占可重入锁,并且内部实现了公平锁与非公平锁,那么下面就让我们一步步往下看吧。二、正文在ReentrantLock类中我们可以看到有一个unlock()方法: public void unlock() { sync.release(1); ...原创 2019-03-28 17:14:05 · 278 阅读 · 0 评论 -
JUC源码解析一:lock()方法的层层剥析
一、前言本次我们以ReentrantLock类来讲解一下lock()方法的调用。首先我们要清楚RentrantLock是一个独占可重入锁,并且内部实现了公平锁与非公平锁,那么下面就让我们一步步往下看吧。二、正文打开源码我们可以看到,RentrantLock类中,只是实现了Serializable接口,声明了这个类是可序列化的。而内部类静态抽象类Sync继承了AbstractQueuedS...原创 2019-03-28 13:44:41 · 296 阅读 · 0 评论 -
JUC源码解析七:Semaphore源码解析
一 前言Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。使用Semaphore可以同时允许指定的线程数量同时执行,超过该数量的线程必须等待直到有线程执行完其任务。特别说明的是信号量只是在信号不够的时候挂起线程,但是并不能保证信号量足够的时候获取对象和返还对象是线程安全的,所以仍需要锁Lock来保证并发的正确性。将信号量的许可值...原创 2019-04-07 09:55:56 · 218 阅读 · 0 评论 -
JUC源码解析四:signal()与sgnalAll()方法的层层剥析
一 前言这一次在await()方法的后面讲,所以这里涉及到的一些写过的基础知识就不再重复了。二 signal()还是国际惯例,从入口处出发: // 将Condition的FIFO条件队列中的第一个线程唤醒 public final void signal() { // 若当前线程不持有锁,则抛出异常 if (!isHeldE...原创 2019-04-01 19:13:10 · 809 阅读 · 0 评论 -
集合源码解析六:基本函数式接口
前言建议看集合源码的童鞋先看着这篇,顺序放错了我也很不好意思~这个应该不算是集合源码的一部分,但是有很多集合源码都使用到了函数式接口,于是写一下这个~其实我们可以看到JDK提供了许多函数式接口,当实际上理解了一下几个其他的也差不多能够轻松上手。一 Function功能型函数式接口// 表示接受一个参数并生成结果的函数。@FunctionalInterfacepublic interfa...原创 2019-04-01 16:44:40 · 169 阅读 · 0 评论 -
集合源码解析五:LinkedList
一 简介LikedList实现了List跟Deque接口,并且实现了所有可选择的list操作。同时允许存储所有的元素(包括空值)由于HashSet的迭代器消耗的时间与HashSet实例元素的大小成正比,再加上capacity容量是依靠HashMap进行实现的,因此在迭代器的效率需要得到重视的情况下,请不要设置太大的初始容量以及太小的加载因子HashSet并没有实现同步,因此在多条线程操作Ha...原创 2019-04-01 16:41:25 · 176 阅读 · 0 评论 -
集合源码四:HashSet
一 简介HashSet可以存放null值,但不允许存在两个相等的元素,后面添加的相同元素会替换掉前者,并且null也只允许存在一个。由于HashSet的迭代器消耗的时间与HashSet实例元素的大小成正比,再加上capacity容量是依靠HashMap进行实现的,因此在迭代器的效率需要得到重视的情况下,请不要设置太大的初始容量以及太小的加载因子HashSet并没有实现同步,因此在多条线程操作...原创 2019-04-01 16:38:40 · 100 阅读 · 0 评论 -
集合源码解析三:HashMap
一 简介HashMap支持存储空的key或空的value,并且不保证存储的元素按顺序排放。它与Hashtable基本相似,只是不支持并发操作。对于get、and、put能操作能够实现常数级别的性能,遍历该集合的性能与HashMap的capacity与load factor成比例,所以,尽量不要设置太高的capacity或太小的load factor。请注意HashMap的实现不支持同步,如果...原创 2019-04-01 16:37:03 · 221 阅读 · 0 评论 -
集合源码解析二:迭代器
一 IterableIterable迭代器是一个fail-fast 与 ConcurrentModificationException的迭代器,即是当迭代器在进行遍历时若对容器进行修改可能会报ConcurrentModificationException的错误。在ArrayList解析中可以看出大量使用了expectedModCount == modCount的判断,用来判断在迭代过程中是否对容...原创 2019-04-01 16:33:40 · 132 阅读 · 0 评论 -
集合源码解析一:ArrayList
一 简介该类实现了一个大小可变的有序集合,对其的操作拥有数组的特性。支持存储所有类型的数据,包括null值。除了没有实现同步操作,其他基本等同于Vector与LinkList类相比,常量因子较低二 成员变量首先看到了ArrayList继承了AbstractList,提供了List接口的骨干实现,减少了实现ArrayList所需的工作。实现了List接口,提供了List集合的基本方法。...原创 2019-04-01 16:32:54 · 168 阅读 · 0 评论 -
JUC源码解析六:CyclicBarrier源码解析
一 前言前面我们学了一次性的闭锁CountDownLatch,下面我们会接触到一个可以循环的同步辅助类:CyclicBarrier,它允许一组线程互相等待,直到到达某个公共屏障点,在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待。CyclicBarrier类似于CountDownLatch的地方是它本身也是个计数器,用以计数的变量则是初始化时传入的变量count。不同点则是Cycl...原创 2019-04-05 20:16:59 · 522 阅读 · 0 评论 -
JUC源码解析三:await()方法的层层剥析
一、前言Condition是一个接口类,是一个在JUC里面提供于控制线程释放锁, 然后进行等待其他获取锁的线程发送 signal 信号来进行唤醒的工具类。在JDK中一共有两个类实现了该接口,分别是AbstractQueuedSynchronizer和AbstractQueuedLongSynchronizer下面我们主要要讲的是AbstractQueuedSynchronizer类中对Con...原创 2019-04-01 02:05:05 · 465 阅读 · 0 评论 -
解读ThreadLocal与Java实战
一 前言在多线程并发的学习中,我们总会接触到一个类,即是ThreadLocal。这个类的作用是提供线程内的局部变量,换句话来说,就是提供一个能与当前线程绑定的局部变量。这个变量能够在多线程并发的环境下保证每个线程中变量的独立性。只要线程处于活动状态并且Threadocal实例可以访问,每个线程就拥有对其线程局部变量副本的隐式引用;在一个线程消失之后,线程本地实例的所有副本都会被垃圾收集(除非存...原创 2019-04-19 15:21:10 · 241 阅读 · 0 评论