深读源码
深读源码
陌隋
这个作者很懒,什么都没留下…
展开
-
深读源码-java线程系列之总结篇
简介线程系列我们基本就学完了,这一个系列我们基本都是围绕着线程池在讲,其实关于线程还有很多东西可以讲,后面有机会我们再补充进来。重要知识点直接上图,看着这张图我相信你能够回忆起很多东西,也可以看着这张图来自己提问自己回答,当然,也可以把这张图作为面试复习的参考。其中,ThreadLocal是我们没有分析的类,放在netty系列来学习,敬请期待^^彩蛋下一个系列我们将学习netty相关的知识,当然跑不掉的还有nio。我为什么直接讲netty了呢?因为netty很重要,很多框转载 2020-06-02 16:14:08 · 118 阅读 · 0 评论 -
深读源码-java线程系列之ForkJoinPool深入解析
简介随着在硬件上多核处理器的发展和广泛使用,并发编程成为程序员必须掌握的一门技术,在面试中也经常考查面试者并发相关的知识。今天,我们就来看一道面试题:如何充分利用多核CPU,计算很大数组中所有整数的和?剖析单线程相加?我们最容易想到就是单线程相加,一个for循环搞定。线程池相加?如果进一步优化,我们会自然而然地想到使用线程池来分段相加,最后再把每个段的结果相加。其它?Yes,就是我们今天的主角——ForkJoinPool,但是它要怎么实现呢?似乎没怎么用过哈^^三种实现转载 2020-06-01 19:50:35 · 400 阅读 · 0 评论 -
深读源码-java线程系列之线程池深入解析——定时任务执行流程
简介前面我们一起学习了普通任务、未来任务的执行流程,今天我们再来学习一种新的任务——定时任务。定时任务是我们经常会用到的一种任务,它表示在未来某个时刻执行,或者未来按照某种规则重复执行的任务。问题(1)如何保证任务是在未来某个时刻才被执行?(2)如何保证任务按照某种规则重复执行?来个栗子创建一个定时线程池,用它来跑四种不同的定时任务。public class ThreadPoolTest03 { public static void main(String[] ar转载 2020-06-01 16:11:09 · 100 阅读 · 0 评论 -
深读源码-java线程系列之线程池深入解析——未来任务执行流程
简介前面我们一起学习了线程池中普通任务的执行流程,但其实线程池中还有一种任务,叫作未来任务(future task),使用它您可以获取任务执行的结果,它是怎么实现的呢?建议学习本章前先去看看之前写的《深读源码-java线程系列之自己手写一个线程池进阶版》,有助于理解本章的内容,且那边的代码比较短小,学起来相对容易一些。问题(1)线程池中的未来任务是怎么执行的?(2)我们能学到哪些比较好的设计模式?(3)对我们未来学习别的框架有什么帮助?来个栗子我们还是从一个例子入手,来讲解来转载 2020-06-01 15:05:51 · 147 阅读 · 0 评论 -
深读源码-java线程系列之线程池深入解析——普通任务执行流程
简介前面我们一起学习了Java中线程池的体系结构、构造方法和生命周期,本章我们一起来学习线程池中普通任务到底是怎么执行的。建议学习本章前先去复习之前《深读源码-java线程系列之自己手写一个线程池》这两章内容,有助于理解本章的内容,且那边的代码比较短小,学起来相对容易一些。问题(1)线程池中的普通任务是怎么执行的?(2)任务又是在哪里被执行的?(3)线程池中有哪些主要的方法?(4)如何使用Debug模式一步一步调试线程池?使用案例我们创建一个线程池,它的核心数量为5,最大转载 2020-06-01 13:35:59 · 178 阅读 · 0 评论 -
阻塞线程不同方式的对比
引子大家知道,我最近在招人,今天遇到个同学,他的源码看过一些,然后我就开始了AQS连环问。我:说说AQS的大致流程?他:AQS包含一个状态变量,一个同步队列……balabala……互斥锁balabala,共享锁balabala……我:AQS中除了同步队列,还有什么队列?他:还有个Condition,Condition中有个条件队列……我:条件队列和同步队列有什么区别?他:条件队列balabala,然后调用LockSupport.park()进入休眠,等待被唤醒,……,balaba转载 2020-05-31 21:28:46 · 248 阅读 · 0 评论 -
深读源码-java线程系列之线程池深入解析——生命周期
简介上一章我们一起重温了下线程的生命周期(六种状态还记得不?),但是你知不知道其实线程池也是有生命周期的呢?!问题(1)线程池的状态有哪些?(2)各种状态下对于任务队列中的任务有何影响?先上源码其实,在我们讲线程池体系结构的时候,讲了一些方法,比如shutDown()/shutDownNow(),它们都是与线程池的生命周期相关联的。我们先来看一下线程池ThreadPoolExecutor中定义的生命周期中的状态及相关方法:private final AtomicIntege转载 2020-05-30 07:24:22 · 212 阅读 · 0 评论 -
深读源码-java线程系列之线程的生命周期
简介大家都知道线程是有生命周期,但是网上几乎没有一篇文章讲得是完全正确的。常见的错误有:就绪状态、运行中状态(RUNNING)、死亡状态、中断状态、只有阻塞没有等待状态、流程图乱画等,最常见的错误就是说线程只有5种状态。今天这篇文章会彻底讲清楚线程的生命周期,并分析synchronized锁、基于AQS的锁中线程状态变化的逻辑。所以,对synchronized锁和AQS原理(源码)不了解的同学,请翻一下博主之前的文章先熟悉这两部分的内容,否则肯定记不住这里讲的线程生命周期。问题(1)转载 2020-05-29 18:56:26 · 117 阅读 · 0 评论 -
深读源码-java线程系列之线程池深入解析——构造方法
简介ThreadPoolExecutor的构造方法是创建线程池的入口,虽然比较简单,但是信息量很大,由此也能引发一系列的问题,同样地,这也是面试中经常被问到的问题,下面只是列举了一部分关于ThreadPoolExecutor构造方法的问题,如果你都能回答上来,则可以不用看下面的分析了。问题(1)ThreadPoolExecutor有几个构造方法?(2)ThreadPoolExecutor最长的构造方法有几个参数?(3)keepAliveTime是做什么用的?(7)核心线程会不会超时关转载 2020-05-29 18:07:07 · 158 阅读 · 0 评论 -
深读源码-java线程系列之线程池深入解析——体系结构
简介Java的线程池是块硬骨头,对线程池的源码做深入研究不仅能提高对Java整个并发编程的理解,也能提高自己在面试中的表现,增加被录取的可能性。本系列将分成很多个章节,本章作为线程池的第一章将对整个线程池体系做一个总览。体系结构上图列举了线程池中非常重要的接口和类:(1)Executor,线程池顶级接口;(2)ExecutorService,线程池次级接口,对Executor做了一些扩展,增加一些功能;(3)ScheduledExecutorService,对Executor转载 2020-05-29 17:46:33 · 172 阅读 · 0 评论 -
深读源码-java线程系列之自己手写一个线程池进阶版
问题(1)自己动手写的线程池如何支持带返回值的任务呢?(2)如果任务执行的过程中抛出异常了该怎么处理呢?简介上一章我们自己动手写了一个线程池,但是它是不支持带返回值的任务的,那么,我们自己能否实现呢?必须可以,今天我们就一起来实现带返回值任务的线程池。前情回顾首先,让我们先回顾一下上一章写的线程池:(1)它包含四个要素:核心线程数、最大线程数、任务队列、拒绝策略;(2)它具有执行无返回值任务的能力;(3)它无法处理有返回值的任务;(4)它无法处理任务执行的异常(线程中转载 2020-05-29 16:33:30 · 146 阅读 · 0 评论 -
深读源码-java线程系列之自己手写一个线程池
问题(1)自己动手写一个线程池需要考虑哪些因素?(2)自己动手写的线程池如何测试?简介线程池是Java并发编程中经常使用到的技术,那么自己如何动手写一个线程池呢?本文将手把手带你写一个可用的线程池。属性分析线程池,顾名思义它首先是一个“池”,这个池里面放的是线程,线程是用来执行任务的。首先,线程池中的线程应该是有类别的,有的是核心线程,有的是非核心线程,所以我们需要两个变量标识核心线程数量coreSize和最大线程数量maxSize。为什么要区分是否为核心线程呢?这是为了控制转载 2020-05-28 22:41:58 · 194 阅读 · 0 评论 -
深读源码-java线程系列之创建线程的8种方式
问题(1)创建线程有哪几种方式?(2)它们分别有什么运用场景?简介创建线程,是多线程编程中最基本的操作,大概有8种创建线程的方式,你知道吗?继承Thread类并重写run()方法public class CreatingThread01 extends Thread { @Override public void run() { System.out.println(getName() + " is running"); } pu转载 2020-05-28 17:45:27 · 99 阅读 · 0 评论 -
深读源码-java线程系列之线程模型
问题(1)线程类型有哪些?(2)线程模型有哪些?(3)各语言使用的是哪种线程模型?简介在Java中,我们平时所说的并发编程、多线程、共享资源等概念都是与线程相关的,这里所说的线程实际上应该叫作“用户线程”,而对应到操作系统,还有另外一种线程叫作“内核线程”。用户线程位于内核之上,它的管理无需内核支持;而内核线程由操作系统来直接支持与管理。几乎所有的现代操作系统,包括 Windows、Linux、Mac OS X 和 Solaris,都支持内核线程。最终,用户线程和内核线程之间必然转载 2020-05-27 19:11:18 · 116 阅读 · 0 评论 -
深读源码-java同步系列之总结篇
简介同步系列到此就结束了,本篇文章对同步系列做一个总结。脑图下面是关于同步系列的一份脑图,列举了主要的知识点和问题点,看过本系列文章的同学可以根据脑图自行回顾所学的内容,也可以作为面试前的准备。总结所谓同步,就是保证多线程(包括多进程)对共享资源的读写能够安全有效的运行。根据同步的运用场景的不同,实现同步的方式也是随之一起变化,但是总结下来,这些实现方式之间又有一些共通之处。不管是互斥锁、读写锁、信号量、CountDownLatch、回环栅栏、Phaser,还是各种分布式锁,转载 2020-05-27 18:35:59 · 117 阅读 · 0 评论 -
深读源码-java同步系列之Phaser源码解析
问题(1)Phaser是什么?(2)Phaser具有哪些特性?(3)Phaser相对于CyclicBarrier和CountDownLatch的优势?简介Phaser,翻译为阶段,它适用于这样一种场景,一个大任务可以分为多个阶段完成,且每个阶段的任务可以多个线程并发执行,但是必须上一个阶段的任务都完成了才可以执行下一个阶段的任务。这种场景虽然使用CyclicBarrier或者CountryDownLatch也可以实现,但是要复杂的多。首先,具体需要多少个阶段是可能会变的,其次,每个阶转载 2020-05-26 21:48:18 · 237 阅读 · 0 评论 -
深读源码-java同步系列之CyclicBarrier源码解析
问题(1)CyclicBarrier是什么?(2)CyclicBarrier具有什么特性?(3)CyclicBarrier与CountDownLatch的对比?简介CyclicBarrier,回环栅栏,它会阻塞一组线程直到这些线程同时达到某个条件才继续执行。它与CountDownLatch很类似,但又不同,CountDownLatch需要调用countDown()方法触发事件,而CyclicBarrier不需要,它就像一个栅栏一样,当一组线程都到达了栅栏处才继续往下走。使用方法转载 2020-05-25 22:45:20 · 153 阅读 · 0 评论 -
深读源码-java同步系列之StampedLock源码解析
问题(1)StampedLock是什么?(2)StampedLock具有什么特性?(3)StampedLock是否支持可重入?(4)StampedLock与ReentrantReadWriteLock的对比?简介StampedLock是java8中新增的类,它是一个更加高效的读写锁的实现,而且它不是基于AQS来实现的,它的内部自成一片逻辑,让我们一起来学习吧。StampedLock具有三种模式:写模式、读模式、乐观读模式。ReentrantReadWriteLock中的读和写转载 2020-05-25 14:00:15 · 235 阅读 · 0 评论 -
深读源码-java同步系列之AQS简介
问题(1)AQS是什么?(2)AQS的定位?(3)AQS的实现原理?(4)基于AQS实现自己的锁?简介AQS的全称是AbstractQueuedSynchronizer,它的定位是为Java中几乎所有的锁和同步器提供一个基础框架。AQS是基于FIFO的队列实现的,并且内部维护了一个状态变量state,通过原子更新这个状态变量state即可以实现加锁解锁操作。本章及后续章节的内容理解起来可能会比较晦涩,建议先阅读上一章的内容《深读源码-java同步系列之自己手写一个锁Lock》转载 2020-05-23 19:57:26 · 159 阅读 · 0 评论 -
深读源码-java同步系列之AQS总结篇
问题(1)AQS的定位?(2)AQS的重要组成部分?(3)AQS运用的设计模式?(4)AQS的总体流程?简介AQS的全称是AbstractQueuedSynchronized,它的定位是为Java中几乎所有的锁和同步器提供一个基础框架。在之前的章节中,我们一起学习了ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch的源码,今天我们一起来对AQS做个总结。状态变量stateAQS中定义了一个状态变量st转载 2020-05-24 18:26:02 · 162 阅读 · 1 评论 -
深读源码-java同步系列之CountDownLatch源码解析
问题(1)CountDownLatch是什么?(2)CountDownLatch具有哪些特性?(3)CountDownLatch通常运用在什么场景中?(4)CountDownLatch的初始次数是否可以调整?简介CountDownLatch,可以翻译为倒计时器,但是似乎不太准确,它的含义是允许一个或多个线程等待其它线程的操作执行完毕后再执行后续的操作。CountDownLatch的通常用法和Thread.join()有点类似,等待其它线程都完成后再执行主任务。类结构C转载 2020-05-24 18:04:41 · 185 阅读 · 1 评论 -
深读源码-java同步系列之Semaphore源码解析
问题(1)Semaphore是什么?(2)Semaphore具有哪些特性?(3)Semaphore通常使用在什么场景中?(4)Semaphore的许可次数是否可以动态增减?(5)Semaphore如何实现限流?简介Semaphore,信号量,它保存了一系列的许可(permits),每次调用acquire()都将消耗一个许可,每次调用release()都将归还一个许可。特性Semaphore通常用于限制同一时间对共享资源的访问次数上,也就是常说的限流。下面我们一起来学习转载 2020-05-24 16:05:27 · 223 阅读 · 1 评论 -
深读源码-java同步系列之ReentrantReadWriteLock源码解析
问题(1)读写锁是什么?(2)读写锁具有哪些特性?(3)ReentrantReadWriteLock是怎么实现读写锁的?(4)如何使用ReentrantReadWriteLock实现高效安全的TreeMap?简介读写锁是一种特殊的锁,它把对共享资源的访问分为读访问和写访问,多个线程可以同时对共享资源进行读访问,但是同一时间只能有一个线程对共享资源进行写访问,使用读写锁可以极大地提高并发量。特性读写锁具有以下特性:是否互斥 读 写 读 否 是转载 2020-05-24 14:52:56 · 229 阅读 · 0 评论 -
深读源码-java同步系列之ReentrantLock与synchronized对比分析
问题(1)ReentrantLock有哪些优点?(2)ReentrantLock有哪些缺点?(3)ReentrantLock是否可以完全替代synchronized?简介synchronized是Java原生提供的用于在多线程环境中保证同步的关键字,底层是通过修改对象头中的MarkWord来实现的。ReentrantLock是Java语言层面提供的用于在多线程环境中保证同步的类,底层是通过原子更新状态变量state来实现的。既然有了synchronized的关键字来保证同步了,为转载 2020-05-24 11:22:20 · 234 阅读 · 0 评论 -
深读源码-java同步系列之ReentrantLock源码解析(二)——条件锁
问题(1)条件锁是什么?(2)条件锁适用于什么场景?(3)条件锁的await()是在其它线程signal()的时候唤醒的吗?简介条件锁,是指在获取锁之后发现当前业务场景自己无法处理,而需要等待某个条件的出现才可以继续处理时使用的一种锁。比如,在阻塞队列中,当队列中没有元素的时候是无法弹出一个元素的,这时候就需要阻塞在条件notEmpty上,等待其它线程往里面放入一个元素后,唤醒这个条件notEmpty,当前线程才可以继续去做“弹出一个元素”的行为。注意,这里的条件,必须是在获取锁转载 2020-05-23 23:25:35 · 218 阅读 · 0 评论 -
深读源码-java同步系列之ReentrantLock源码解析(一)——公平锁、非公平锁
问题(1)重入锁是什么?(2)ReentrantLock如何实现重入锁?(3)ReentrantLock为什么默认是非公平模式?(4)ReentrantLock除了可重入还有哪些特性?简介Reentrant = Re + entrant,Re是重复、又、再的意思,entrant是enter的名词或者形容词形式,翻译为进入者或者可进入的,所以Reentrant翻译为可重复进入的、可再次进入的,因此ReentrantLock翻译为重入锁或者再入锁。重入锁,是指一个线程获取锁之后再尝试转载 2020-05-23 22:09:27 · 204 阅读 · 0 评论 -
深读源码-java并发包总结篇
概览原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中的一部分,将整个操作视作一个整体是原子性的核心特征。在java中提供了很多原子类,笔者在此主要把这些原子类分成四大类。原子更新基本类型或引用类型如果是基本类型,则替换其值,如果是引用,则替换其引用地址,这些类主要有:(1)AtomicBoolean原子更新布尔类型,内部使转载 2020-05-21 17:26:51 · 96 阅读 · 0 评论 -
深读源码-java并发包之LongAdder源码分析
问题(1)java8中为什么要新增LongAdder?(2)LongAdder的实现方式?(3)LongAdder与AtomicLong的对比?简介LongAdder是java8中新增的原子类,在多线程环境中,它比AtomicLong性能要高出不少,特别是写多的场景。它是怎么实现的呢?让我们一起来学习吧。原理LongAdder的原理是,在最初无竞争时,只更新base的值,当有多线程竞争时通过分段的思想,让不同的线程更新不同的段,最后把这些段相加就得到了完整的LongAdder转载 2020-05-21 15:48:09 · 210 阅读 · 0 评论 -
深读源码-java并发包之AtomicStampedReference源码分析
问题(1)什么是ABA?(2)ABA的危害?(3)ABA的解决方法?(4)AtomicStampedReference是什么?(5)AtomicStampedReference是怎么解决ABA的?简介AtomicStampedReference是java并发包下提供的一个原子类,它能解决其它原子类无法解决的ABA问题。ABAABA问题发生在多线程环境中,当某线程连续读取同一块内存地址两次,两次得到的值一样,它简单地认为“此内存地址的值并没有被修改过”,然而,同时可能存在另转载 2020-05-21 11:29:13 · 396 阅读 · 0 评论 -
深读源码-java并发包之AtomicInteger源码分析
问题(1)什么是原子操作?(2)原子操作和数据库的ACID有啥关系?(3)AtomicInteger是怎么实现原子操作的?(4)AtomicInteger是有什么缺点?简介AtomicInteger是java并发包下面提供的原子类,主要操作的是int类型的整型,通过调用底层Unsafe的CAS等方法实现原子操作。还记得Unsafe吗?点击链接直达《深读源码-java魔法类之Unsafe解析》原子操作原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结转载 2020-05-21 09:47:20 · 207 阅读 · 0 评论 -
深读源码-java魔法类之Unsafe解析
问题(1)Unsafe是什么?(2)Unsafe只有CAS的功能吗?(3)Unsafe为什么是不安全的?(4)怎么使用Unsafe?简介本章是java并发包专题的第一章,但是第一篇写的却不是java并发包中类,而是java中的魔法类sun.misc.Unsafe。很多低级语言中可用的技巧在Java中都是不被允许的。Java是一个安全的开发工具,它阻止开发人员犯很多低级的错误,而大部份的错误都是基于内存管理方面的。我们知道JAVA作为高级语言的重要创新一点就是在于JVM的内存管转载 2020-05-20 15:21:24 · 470 阅读 · 0 评论 -
深读源码-java集合之DelayQueue源码分析
问题(1)DelayQueue是阻塞队列吗?(2)DelayQueue的实现方式?(3)DelayQueue主要用于什么场景?简介DelayQueue是java并发包下的延时阻塞队列,常用于实现定时任务。继承体系从继承体系可以看到,DelayQueue实现了BlockingQueue,所以它是一个阻塞队列。另外,DelayQueue还组合了一个叫做Delayed的接口,DelayQueue中存储的所有元素必须实现Delayed接口。那么,Delayed是什么呢?转载 2020-05-18 19:09:34 · 172 阅读 · 0 评论 -
深读源码-java集合之ConcurrentLinkedQueue源码分析
问题(1)ConcurrentLinkedQueue是阻塞队列吗?(2)ConcurrentLinkedQueue如何保证并发安全?(3)ConcurrentLinkedQueue能用于线程池吗?简介ConcurrentLinkedQueue只实现了Queue接口,并没有实现BlockingQueue接口,所以它不是阻塞队列,也不能用于线程池中,但是它是线程安全的,可用于多线程环境中。那么,它的线程安全又是如何实现的呢?让我们一起来瞧一瞧。源码分析主要属性// 链表转载 2020-05-18 18:26:32 · 214 阅读 · 0 评论 -
深读源码-java集合之LinkedTransferQueue源码分析
问题(1)LinkedTransferQueue是什么?(2)LinkedTransferQueue是怎么实现阻塞队列的?(3)LinkedTransferQueue是怎么控制并发安全的?(4)LinkedTransferQueue与SynchronousQueue有什么异同?简介LinkedTransferQueue是LinkedBlockingQueue、SynchronousQueue(公平模式)、ConcurrentLinkedQueue三者的集合体,它综合了这三者的方法,并转载 2020-05-18 17:19:36 · 125 阅读 · 0 评论 -
深读源码-java集合之PriorityBlockingQueue源码分析
问题(1)PriorityBlockingQueue的实现方式?(2)PriorityBlockingQueue是否需要扩容?(3)PriorityBlockingQueue是怎么控制并发安全的?简介PriorityBlockingQueue是java并发包下的优先级阻塞队列,它是线程安全的,如果让你来实现你会怎么实现它呢?还记得我们前面介绍过的PriorityQueue吗?点击链直达《深读源码-java集合之PriorityQueue源码分析》还记得优先级队列一般使用什么来实现转载 2020-05-17 21:35:31 · 141 阅读 · 0 评论 -
深读源码-java集合之SynchronousQueue源码分析
问题(1)SynchronousQueue的实现方式?(2)SynchronousQueue真的是无缓冲的吗?(3)SynchronousQueue在高并发情景下会有什么问题?简介SynchronousQueue是java并发包下无缓冲阻塞队列,它用来在两个线程之间移交元素,但是它有个很大的问题,你知道是什么吗?请看下面的分析。继承体系源码分析主要属性// CPU的数量static final int NCPUS = Runtime.getRuntime().av转载 2020-05-17 20:17:31 · 275 阅读 · 0 评论 -
深读源码-java集合之LinkedBlockingQueue源码分析
问题(1)LinkedBlockingQueue的实现方式?(2)LinkedBlockingQueue是有界的还是无界的队列?(3)LinkedBlockingQueue相比ArrayBlockingQueue有什么改进?简介LinkedBlockingQueue是java并发包下一个以单链表实现的阻塞队列,它是线程安全的,至于它是不是有界的,请看下面的分析。继承体系源码分析主要属性// 容量private final int capacity;// 元素数转载 2020-05-17 18:15:47 · 163 阅读 · 0 评论 -
深读源码-java集合之ArrayBlockingQueue源码分析
问题(1)ArrayBlockingQueue的实现方式?(2)ArrayBlockingQueue是否需要扩容?(3)ArrayBlockingQueue有什么缺点?简介ArrayBlockingQueue是java并发包下一个以数组实现的阻塞队列,它是线程安全的,至于是否需要扩容,请看下面的分析。继承体系队列队列,是一种线性表,它的特点是先进先出,又叫FIFO,就像我们平常排队一样,先到先得,即先进入队列的人先出队。源码分析主要属性// 使用数组存储元素转载 2020-05-17 17:18:57 · 196 阅读 · 0 评论 -
深读源码-java集合之ConcurrentSkipListSet源码分析
问题(1)ConcurrentSkipListSet的底层是ConcurrentSkipListMap吗?(2)ConcurrentSkipListSet是线程安全的吗?(3)ConcurrentSkipListSet是有序的吗?(4)ConcurrentSkipListSet和之前讲的Set有何不同?继承体系简介ConcurrentSkipListSet底层是通过ConcurrentNavigableMap来实现的,它是一个有序的线程安全的集合。源码分析它的源码比较转载 2020-05-17 16:32:57 · 218 阅读 · 0 评论 -
深读源码-java集合之CopyOnWriteArraySet源码分析
问题(1)CopyOnWriteArraySet是用Map实现的吗?(2)CopyOnWriteArraySet是有序的吗?(3)CopyOnWriteArraySet是并发安全的吗?(4)CopyOnWriteArraySet以何种方式保证元素不重复?(5)如何比较两个Set中的元素是否完全一致?简介CopyOnWriteArraySet底层是使用CopyOnWriteArrayList存储元素的,所以它并不是使用Map来存储元素的。但是,我们知道CopyOnWriteAr转载 2020-05-17 16:05:12 · 265 阅读 · 0 评论