JDK、JUC
文章平均质量分 90
jdk底层源码
早上真起不来!
因为有目标
展开
-
【JDK源码】线程系列之ThreadLocal
简介ThreadLocal这个类提供线程局部变量,这些变量与其他正常的变量的不同之处在于,每一个访问该变量的线程在其内部都有一个独立的初始化的变量副本;ThreadLocal实例变量通常采用 private static 在类中修饰。只要 ThreadLocal 的变量能被访问,并且线程存活,那每个线程都会持有 ThreadLocal变量的副本。当一个线程结束时,它所持有的所有 ThreadLocal 相对的实例副本都可被回收。一句话说就是 ThreadLocal 适用于每个线程需要自己独立原创 2021-11-23 08:28:56 · 1042 阅读 · 48 评论 -
【JDK源码】线程系列之FutureTask
文章目录简介继承体系源码分析Runnable接口Callable接口Future接口成员属性构造方法成员方法run()get()cancel()总结简介在Java中一般通过继承Thread类或者实现Runnable接口这两种方式来创建多线程,但是这两种方式都有个缺陷,就是不能在执行完成后获取执行的结果,因此Java 1.5之后提供了Callable和Future接口,通过它们就可以在任务执行完毕之后得到任务的执行结果。继承体系源码分析Runnable接口public interface Run原创 2021-11-22 13:12:11 · 1334 阅读 · 34 评论 -
【JDK源码】集合源码目录,冲冲冲
集合源码直达,冲冲冲【JDK源码】集合之ArrayList【JDK源码】集合之LinkedList【JDK源码】集合之解决ArrayList线程不安全【JDK源码】集合之CopyOnWriteArrayList【JDK源码】集合之HashMap【JDK源码】集合之TreeMap【JDK源码】集合之HashTable【JDK源码】集合之LinkedHashMap【JDK源码】集合之ConcurrentHashMap...原创 2021-11-21 11:50:30 · 2013 阅读 · 22 评论 -
【JDK源码】两万字暴淦ConcurrentHashMap
文章目录开篇问题简介各种锁简介源码分析成员属性构造方法添加元素初始化桶数组判断是否需要扩容协助扩容(迁移元素)迁移元素删除元素获取元素获取元素个数总结开篇问题(1)ConcurrentHashMap与HashMap的数据结构是否一样?(2)HashMap在多线程环境下何时会出现并发安全问题?(3)ConcurrentHashMap是怎么解决并发安全问题的?(4)ConcurrentHashMap使用了哪些锁?(5)ConcurrentHashMap的扩容是怎么进行的?(6)Concurrent原创 2021-11-21 11:42:06 · 301 阅读 · 22 评论 -
【JDK源码】同步系列AQS完结及目录
AQS目录【JDK源码】同步系列synchronized【JDK源码】同步系列手写Lock【JDK源码】同步系列AQS初识【JDK源码】同步系列AQS之ReentrantLock【JDK源码】同步系列AQS之条件锁【JDK源码】同步系列AQS之ReentrantLock VS synchronized【JDK源码】同步系列AQS之ReentrantReadWriteLock(万字解析)【JDK源码】同步系列AQS之Semaphore【JDK源码】同步系列AQS之CountDownLatc.原创 2021-11-20 09:33:15 · 693 阅读 · 16 评论 -
【JDK源码】同步系列AQS之CyclicBarrier
文章目录简介使用方法源码分析主要内部类主要属性构造方法await()方法图解总结问题简介CyclicBarrier,回环栅栏,它会阻塞一组线程直到这些线程同时达到某个条件才继续执行。它与CountDownLatch很类似,但又不同,CountDownLatch需要调用countDown()方法触发事件,而CyclicBarrier不需要,它就像一个栅栏一样,当一组线程都到达了栅栏处才继续往下走。使用方法public class CyclicBarrierTest { public stati原创 2021-11-20 09:19:24 · 306 阅读 · 14 评论 -
【JDK源码】同步系列AQS之CountDownLatch
【JDK源码】同步系列synchronized【JDK源码】同步系列手写Lock【JDK源码】同步系列AQS初识【JDK源码】同步系列AQS之ReentrantLock【JDK源码】同步系列AQS之条件锁【JDK源码】同步系列AQS之ReentrantLock VS synchronized【JDK源码】同步系列AQS之ReentrantReadWriteLock(万字解析)【JDK源码】同步系列AQS之Semaphore文章目录简介类结构源码分析内部类Sync构造方法await()方法.原创 2021-11-19 14:45:37 · 1663 阅读 · 14 评论 -
【JDK源码】同步系列AQS之Semaphore
【JDK源码】同步系列synchronized【JDK源码】同步系列手写Lock【JDK源码】同步系列AQS初识【JDK源码】同步系列AQS之ReentrantLock【JDK源码】同步系列AQS之条件锁【JDK源码】同步系列AQS之ReentrantLock VS synchronized【JDK源码】同步系列AQS之ReentrantReadWriteLock(万字解析)文章目录简介特性类结构源码分析内部类Sync内部类NonfairSync内部类FairSync构造方法acquire.原创 2021-11-19 11:36:43 · 521 阅读 · 32 评论 -
【JDK源码】同步系列AQS之ReentrantReadWriteLock(万字解析)
简介读写锁是一种特殊的锁,它把对共享资源的访问分为读访问和写访问,多个线程可以同时对共享资源进行读访问,但是同一时间只能有一个线程对共享资源进行写访问,使用读写锁可以极大地提高并发量。特性是否互斥读写读否是写是是可以看到,读写锁除了读读不互斥,读写、写读、写写都是互斥的。类结构ReentrantReadWriteLock中的类分成三个部分:(1)ReentrantReadWriteLock本身实现了ReadWriteLock接口,这个接口只提供了两个方原创 2021-11-18 12:04:17 · 2297 阅读 · 30 评论 -
【JDK源码】同步系列AQS之ReentrantLock VS synchronized
文章目录简介ReentrantLock VS synchronized对比测试总结简介synchronized是Java原生提供的用于在多线程环境中保证同步的关键字,底层是通过修改对象头中的MarkWord来实现的。ReentrantLock是Java语言层面提供的用于在多线程环境中保证同步的类,底层是通过原子更新状态变量state来实现的。ReentrantLock VS synchronized功能ReentrantLocksynchronized可重入支持支持原创 2021-11-17 16:00:50 · 893 阅读 · 26 评论 -
【JDK源码】同步系列AQS之条件锁
文章目录简介使用示例源码分析ConditionObject的主要属性lock.newCondition()方法condition.await()方法condition.signal()方法总结简介条件锁,是指在获取锁之后发现当前业务场景自己无法处理,而需要等待某个条件的出现才可以继续处理时使用的一种锁。注意,这里的条件,必须是在获取锁之后去等待,对应到ReentrantLock的条件锁,就是获取锁之后才能调用condition.await()方法。在java中,条件锁的实现都在AQS的Conditi原创 2021-11-17 11:51:42 · 1801 阅读 · 16 评论 -
【JDK源码】同步系列AQS之ReentrantLock
文章目录简介继承体系源码分析主要内部类主要属性主要构造方法lock()方法公平锁非公平锁lockInterruptibly()方法tryLock()方法tryLock(long time, TimeUnit unit)方法unlock()方法问题简介Reentrant = Re + entrant,Re是重复、又、再的意思,entrant是enter的名词或者形容词形式,翻译为进入者或者可进入的,所以Reentrant翻译为可重复进入的、可再次进入的,因此ReentrantLock翻译为重入锁或者再入锁原创 2021-11-16 11:47:38 · 421 阅读 · 34 评论 -
【JDK源码】同步系列AQS初识
文章目录简介核心源码主要内部类主要属性子类需要实现的主要方法基于AQS自己动手写一个锁总结简介AQS的全称是AbstractQueuedSynchronizer,它的定位是为Java中几乎所有的锁和同步器提供一个基础框架。AQS是基于FIFO的队列实现的,并且内部维护了一个状态变量state,通过原子更新这个状态变量state即可以实现加锁解锁操作。可以先参考一下【JDK源码】同步系列手写Lock,这个Lock其实可以看成是AQS的一个缩影核心源码主要内部类static final cl原创 2021-11-15 11:59:37 · 1603 阅读 · 37 评论 -
【JDK源码】同步系列手写Lock
文章目录简介分析解决一个变量CAS一个队列加锁解锁测试总代码总结问题简介学习同步器之前,通过自己动手写一个锁,能更好地理解AQS及各种同步器实现的原理。分析自己动手写一个锁需要准备些什么呢?synchronized说过它的实现原理是更改对象头中的MarkWord,标记为已加锁或未加锁。但是,我们自己是无法修改对象头信息的,那么我们可不可以用一个变量来代替呢?比如,这个变量的值为1的时候就说明已加锁,变量值为0的时候就说明未加锁。其次,我们要保证多个线程对上面我们定义的变量的争用是可控的,所谓可控原创 2021-11-14 11:18:01 · 2278 阅读 · 35 评论 -
【JDK源码】同步系列synchronized
文章目录名词解释简介实现原理原子性、可见性、有序性公平锁 VS 非公平锁锁优化总结synchronized的五种使用方式名词解释(1)公平锁/非公平锁公平锁,是指按照线程申请的顺序获取锁。非公平锁,是指不是按照线程申请的顺序获取锁,有可能后申请的线程反而先获取到锁,假如先来的线程一直获取不到锁,会造成锁饥饿现象。ReentrantLock中可以通过构造方法指定是否为公平锁,默认为非公平锁,非公平锁的优点在于吞吐量大。synchronized无法指定为公平锁,一直都是非公平锁。(2)可重入锁可原创 2021-11-13 10:05:25 · 896 阅读 · 26 评论 -
【JDK源码】并发原子类总结
总结原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中的一部分,将整个操作视作一个整体是原子性的核心特征。在java中提供了很多原子类问题关于原子类的问题,大概有以下这些:(1)Unsafe是什么?(2)Unsafe的实例怎么获取?(3)Unsafe的CAS操作?(4)Unsafe的阻塞/唤醒操作?(5)Unsafe实例化一个类?(原创 2021-11-12 08:26:49 · 457 阅读 · 24 评论 -
【JDK源码】并发原子类LongAdder
文章目录LongAdder简介原理源码分析主要内部类主要属性add(x)方法longAccumulate()方法sum()方法LongAdder VS AtomicLong总结LongAdder简介LongAdder是java8中新增的原子类,在多线程环境中,它比AtomicLong性能要高出不少,特别是写多的场景原理LongAdder的原理是,在最初无竞争时,只更新base的值,当有多线程竞争时通过分段的思想,让不同的线程更新不同的段,最后把这些段相加就得到了完整的LongAdder存储的值。原创 2021-11-11 13:49:41 · 974 阅读 · 32 评论 -
【JDK源码】并发原子类AtomicStampedReference
文章目录简介ABA内部类构造方法compareAndSet()方法案例总结简介AtomicStampedReference是java并发包下提供的一个原子类,它能解决其它原子类无法解决的ABA问题,比如AtomicInteger存在ABA问题ABAABA问题发生在多线程环境中,当某线程连续读取同一块内存地址两次,两次得到的值一样,它简单地认为“此内存地址的值并没有被修改过”,然而,同时可能存在另一个线程在这两次读取之间把这个内存地址的值从A修改成了B又修改回了A,这时还简单地认为“没有修改过”显然是原创 2021-11-10 11:36:20 · 5020 阅读 · 18 评论 -
【JDK源码】并发原子类AtomicInteger
文章目录简介原子操作主要属性compareAndSet()方法getAndIncrement()方法总结扩展简介AtomicInteger是java并发包下面提供的原子类,主要操作的是int类型的整型,通过调用底层Unsafe的CAS等方法实现原子操作。【JDK】魔法类Unsafe原子操作原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中原创 2021-11-09 11:33:57 · 777 阅读 · 18 评论 -
【JDK源码】魔法类Unsafe
文章目录简介获取Unsafe的实例使用Unsafe实例化一个类修改私有字段的值抛出checked异常使用堆外内存park/unpark总结扩展简介Unsafe为我们提供了访问底层的机制,这种机制仅供java核心类库使用,而不应该被普通用户使用。但是,为了更好地了解java的生态体系,我们应该去学习它,去了解它,不求深入到底层的C/C++代码,但求能了解它的基本功能。获取Unsafe的实例可以看到Unsafe仅供java内部类使用private Unsafe() {} // 私有构造privat原创 2021-11-08 16:53:27 · 1021 阅读 · 20 评论 -
【JDK源码】集合之CopyOnWriteArrayList
简介CopyOnWriteArrayList是ArrayList的线程安全版本,ArrayList可以参考【JDK源码】ArrayList,多线程环境下可以直接使用,无需加锁,内部也是通过数组实现,通过锁 + 数组拷贝 + volatile 关键字保证了线程安全,每次对数组的修改都完全拷贝一份新的数组来修改,修改完了再替换掉老数组,这样保证了只阻塞写操作,不阻塞读操作,实现读写分离。CopyOnWriteArrayList 数据结构和 ArrayList 是一致的,底层是个数组,只不过 Copy原创 2021-11-06 14:55:47 · 323 阅读 · 6 评论 -
【JDK源码】集合之LinkedHashMap
文章目录简介继承体系基本属性构造方法内部类newNode()afterNodeAccess()afterNodeInsertion()afterNodeInsertion 方法的意义是什么呢实现一个大小确定的LRUafterNodeRemoval ()总结简介public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>{LinkedHashMap内部维护了一个双原创 2021-11-06 11:45:42 · 694 阅读 · 4 评论 -
【JDK源码】HashTable
文章目录继承体系基本属性构造方法put()addEntry()rehash()get()remove()Hashtable 和 HashMap的区别先去了解HashMap效果更佳【JDK源码】HashMap(一)继承体系Hashtable 的函数都是同步的,这意味着它是线程安全的,能用于多线程环境中。它的key、value都不可以为null。Hashtable中的映射不是有序的。Hashtable采用"拉链法"实现哈希表。基本属性/** * 哈希表数据 */private tran原创 2021-11-05 18:10:43 · 291 阅读 · 18 评论 -
【JDK源码】TreeMap
TreeMap与HashMap【JDK源码】HashMapTreeMap继承体系SortedMap 是一个扩展自 Map 的一个接口,对该接口的实现要保证所有的 Key 是完全有序的(也就是说SortedMap规定了元素可以按key的大小来遍历)。这个顺序一般是指 Key 的自然序(实现 Comparable 接口)或在创建 SortedMap 时指定一个比较器(Comparator)。当我们元素迭代时,就可以按序访问其中的元素。NavigableMap 是 JDK 1.6 之后新增的接口,.原创 2021-11-05 14:41:51 · 378 阅读 · 2 评论 -
【JDK源码】LinkedList
文章目录简介内部结构addremovesetgetArrayList和LinkedList简介LinkedList将做为双链表来实现,它本身实现了List接口和Deque接口(即满足队列的特性),并且实现了所有可选的列表操作,并且允许包含所有元素(包括null)。面试中经常问到LinkedList和ArrayList的区别 可以参考对比【JDK源码】ArrayList下图是LinkedList的UML图:从图中我们可以看出:继承了AbstractSequentialList抽象类:在遍历L原创 2021-11-01 15:27:28 · 261 阅读 · 0 评论 -
【JDK源码】HashMap(二)jdk1.7与1.8
基于上一篇博客继续分析JDK1.7、1.8 HashMap的差异JDK1.8中hashmap实现相较于1.7有重大的变化Hash算法有什么区别呢?JDK 1.7JDK 1.8区别1.8计算出来的结果只可能是一个,所以hash值设置为final修饰。1.7会先判断这Object是否是String,如果是,则不采用String复写的hashcode方法,处于一个Hash碰撞安全问题的考虑初始化又有什么区别呢?JDK1.8 构造方法tableSize.原创 2021-10-30 12:46:41 · 123 阅读 · 0 评论 -
【JDK源码】HashSet、HashMap(一)
文章目录HashSetHashSet实现原理HashSet 中数据是如何保证不重复的HashMapput方法HashSetHashSet实现原理由于set是基于map实现的 这里主要介绍map是基于HashMap实现的,默认构造函数是构建一个初始容量为16,负载因子为0.75 的HashMap。封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT原创 2021-10-29 22:37:08 · 467 阅读 · 0 评论 -
【JDK源码】解决ArrayList线程不安全
ArrayList 在并发情况下是不安全的!解决方案:1、切换成Vector就是线程安全的啦!public class ListTest { public static void main(String[] args) { List<Object> arrayList = new Vector<>(); }}Vector的add方法,Vector比ArrayList更早出现,所以Vector只是其中一种解决办法2、使用工具类 Colle原创 2021-10-29 10:07:10 · 164 阅读 · 0 评论 -
【JDK源码】ArrayList
文章目录简介ArrayList的常量与变量ArrayList的构造方法ArrayList()ArrayList(int initialCapacity)ArrayList(Collection c)ArrayList的方法add()总结:get()set()remove()ArrayList线程不安全简介ArrayList继承自 AbstractList,实现了 List 接口。底层基于数组实现容量大小动态变化。允许 null 的存在。同时还实现了 RandomAccess、Cloneable、Ser原创 2021-10-28 23:13:00 · 553 阅读 · 0 评论