Skip to content

Latest commit

 

History

History
1344 lines (1342 loc) · 86.1 KB

已阅代码清单_按功能划分.md

File metadata and controls

1344 lines (1342 loc) · 86.1 KB

已阅代码清单_按功能排序

序号 图标 含义
1 🌲 形似大写字母A,代表该类为抽象类(Abstract)
2 🍼 形似小写字母i,代表该类为接口(interface)
3 🐳 形似大写字母C,代表该类为普通类(Class)


  • 包装
    • 🌲 Number

      所有数值类型的公共祖先,该类只声明了各个数值类型的拆箱方法

    • 🐳 Integer

      int的包装类型,包含了装箱、拆箱、字符串转Integer等方法。其中该类声明了IntegerCache内部类,用于缓存[-128,127]范围内的数值

    • 待看

    • Byte
    • Short
    • Long
    • Float
    • Double
    • Character
    • Boolean
    • Void
    • Enum

  • 底层操作
    • 🐳 Unsafe (sun.misc)
    • 🐳 Unsafe (jdk.internal.misc)

      两个类功能相似,但是internal/misc/Unsafe.java的方法更细
      应用场景:(1)分配、释放内存 (2)对某个对象的本地内存/jvm内存对应(地址)的值进行操作
      (3)原子操作(CAS无锁):如新值替换旧值[compareAndExchangeXXX、getAndSetXXX]、增减值[getAndAddXXX]
      (4)内存屏障指令 (5)线程操作park/unpark(类似wait/notify)

    • 🐳 VarHandle

      UnSafe类提供了不安全的操作,官方不允许开发者使用,该类损害了安全性和可移植性。 VarHandle被称作变量句柄是对变量的类型化引用,VarHandle从Java9才有。VarHandle提供了atomic以及UnSafe类相似功能。更加安全和易用,在并发方面提高了性能。


  • 线程
    • 🍼 Runnable

      用于构建任务,可用函数化创建该对象

    • 🐳 Thread

      实现Runnable接口,用于创建线程执行Runnable的任务。Thread有个ThreadLocal.ThreadLocalMap变量用于存储当前线程的独享变量

    • 🐳 ThreadGroup

      用于管理当前线程所在的线程组、当前线程的子线程组以及父线程

    • 🐳 ThreadLocal

      1.ThreadLocalMap、Entry在ThreadLocal内部类中,ThreadLocalMap类似HashMap,通过Entry[]存储当前线程的k-v独享变量数组
      2.Entry构建了k-v独享变量,其中k为被WeakReference包装的ThreadLocal变量,v为Object类型,一个ThreadLocal对象只能关联一个值

    • 🍼 ThreadFactory

      线程工厂,通过继承该接口,创建自定义的线程

    • 🍼 Interruptible

      线程中断回调标记,该接口只有一个interrupt方法,当线程被中断后可回调该方法

    • 待看

    • InnocuousThread
    • InheritableThreadLocal
    • TerminatingThreadLocal

  • 同步/并发
    • 🐳 CountDownLatch

      闭锁。基于AQS
      1.类似开闸放水。state等于闸门数量,调用await()的线程即等待闸门的线程(主线程,可能多个),当state!=0说明还存在闸门,不能被放行,进入AQS的同步队列中被阻塞
      2.调用countDown的线程即开闸门的线程(子线程),每调用一次countDown,闸门数state-1 3.当某个子线程在开闸门(state=state-1)过程中,发现更新后的state=0,则一次性唤醒在AQS的同步队列中所有主线程

    • 🐳 CyclicBarrier

      同步屏障/循环栅栏,基于ReentrantLock+Condition实现,与AQS无关
      1.设定parties值,表示容纳的最大线程数量。count初始值=parties
      2.线程每调用await,count减1。当count!=0,线程被阻塞。当count=0时,signalAll所有线程
      3.若某一个线程被中断或者阻塞时间到期,则栅栏失效,signalAll所有线程
      4.CyclicBarrier可重复使用,当signalAll所有线程后,count再次被重新设定为parties值

    • 🐳 Semaphore

      计数信号量,基于AQS 设定阈值state。多线程可以申请锁,每申请一次state-1。每释放锁,state+1。只有state>0才可申请锁。

    • 🍼 Executor

      任务执行器,只包含execute(Runnable)方法,执行Runnable类型的任务

    • 🍼 ExecutorService

      1.任务执行服务,用户向任务执行服务提交任务后,由任务执行服务调度、执行任务
      2.典型的实现类为[任务池]ForkJoinPool与[线程池]ThreadPoolExecutor。

    • ScheduledExecutorService

    • 🌲 AbstractExecutorService

      实现ExecutorService的抽象类,有两个重要子类ForkJoinPool与ThreadPoolExecutor

    • ForkJoinPool

    • 🐳 ThreadPoolExecutor

      该类含有的关键属性:线程池=>HashSet workerPool 同步队列=>BlockingQueue workQueue。其中Worker含有的属性:当前待执行任务=>Runnable firstTask 执行firstTask任务的线程Thread workerThread。以下为线程池的处理过程。
      1.线程池数量小于corePoolSize,创建新的Worker到workerPool中,并执行新任务(Worker的属性firstTask引用该任务)。即新线程是携带任务的,且只执行该任务。执行后,会将firstTask赋值为null,则该线程不携带任务,可执行同步队列中的任务。
      2.线程池数量大于或等于corePoolSize,且同步队列未满,则将任务firstTask添加到workQueue中
      3.线程池数量大于corePoolSize且小于maximumPoolSize,且同步队列已满,创建新的Worker执行任务firstTask
      4.线程池数量大于maximumPoolSize,采用拒绝策略处理新任务

    • ScheduledThreadPoolExecutor

    • 🍼 Callable

      1.该接口只有一个call()方法,表示有返回值的任务 2.与Runnable相似都表示执行的任务。区别在于该接口可以返回值,且可能抛出异常

    • 🍼 Future

      1.Future表示一类带有返回值、可异步执行的任务
      2.可获取任务计算结果、取消任务, 调用get的线程,若任务未完成,会被阻塞

    • 🍼 RunnableFuture

      RunnableFuture表示兼容Runnable的带有异步计算的任务。该接口继承Runnable以及Future。是Runnable和Future的合体

    • 🐳 FutureTask

      1.FutureTask表示一类将来会被完成的异步任务,这类任务带有返回值,且中途可被取消。该类实现了RunnableFuture接口
      2.该类提供了Runnable与Future的基本实现,包括启动和取消任务,查询任务是否结束,以及获取任务执行结果。
      3.FutureTask涉及两类线程,一个是执行任务的线程,一个是获取任务结果的线程,前者只有一个,后者可以有多个。当任务还没完成时,获取任务结果的线程调用get,会被阻塞放入到栈中。当任务完成后,会唤醒栈中的所有线程

    • ForkJoinTask

    • RecursiveTask

    • RecursiveAction

    • CountedCompleter

    • ForkJoinWorkerThread

    • 🍼 Delayed

      1.Delayed是一个延时性接口,一般用来约束带有延时属性的任务或组件,该接口只有一个方法getDelay,以获取距任务触发还剩余的时间
      2.Delayed接口继承了Comparable,因此接口的子类本身必须具备"可比较性"

    • ScheduledFuture

    • RunnableScheduledFuture

    • 🍼 RejectedExecutionHandler

      线程池的拒绝策略接口机类,开发人员可以实现该接口,自定义线程池的拒绝策略

    • Executors

    • CompletionService

    • ExecutorCompletionService

    • 🐳 Exchanger

      Exchanger用于两个线程之间交换数据

    • Phaser

    • Flow

    • SubmissionPublisher

    • CompletionStage

    • CompletableFuture


  • 原子操作
    • 🐳 AtomicBoolean

      调用VarHandle方法进行CAS的操作

    • 🐳 AtomicInteger

      调用Unsafe方法进行CAS的操作

    • 🐳 AtomicLong

      同AtomicInteger

    • 🐳 AtomicReference

      同AtomicInteger

    • 🐳 AtomicIntegerArray

      不是对整个数组进行原子操作,而是对数组下标对应的一个元素进行原子操作。调用VarHandle方法进行CAS的操作

    • 🐳 AtomicLongArray

      同AtomicIntegerArray

    • 🐳 AtomicReferenceArray

      同AtomicIntegerArray

    • 🌲 AtomicIntegerFieldUpdater

      1.当需要将类的某个修饰符为volatile int成员变量改造成AtomicInteger,但不能直接修改源代码时,可以使用AtomicIntegerFieldUpdater将该成员变量转化成AtomicInteger
      2.成员变量必须是volatile和int类型且不能是private

    • 🌲 AtomicLongFieldUpdater

      规则同AtomicIntegerFieldUpdater

    • 🌲 AtomicReferenceFieldUpdater

      规则同AtomicIntegerFieldUpdater,但不限制成员变量类型。但必须被volatile和private修饰

    • 🐳 AtomicStampedReference

      有个私有内部类Pair,存储了值reference以及为解决ABA问题引入的版本戳stamp,在进行CAS操作时,还需要对比stamp的值

    • 🐳 AtomicMarkableReference

      1.和AtomicStampedReference类似,区别在于AtomicStampedReference的stamp类型为int,而AtomicMarkableReference的stamp类型为boolean。
      2.由于AtomicMarkableReference的版本戳只有0和1两种值,AtomicMarkableReference并不能完全避免ABA问题,只是降低了ABA发生的概率

    • 🌲 Striped64

      Striped意为“条带”,也就是分片。是LongAdder,DoubleAdder,LongAccumulator,DoubleAccumulator的父类。该类有个内部静态类Cell,用以解决高并发下的累加操作

    • 🐳 LongAdder

      AtomicInteger只能对value进行算数操作,在高并发下有较大竞争。
      LongAdder把一个Long型拆成一个base变量和Cell[],每个Cell包装了一个Long型变量。将冲突分摊到base和Cell进行算法操作,最后将base和Cell中的值进行累加得到最终结果
      由于进行sum()累加操作时,没有对cell[]加锁只能保证最终一致性,不能强一致性,不适合严格同步的场景

    • 🐳 LongAccumulator

      和LongAdder的base默认为0,LongAccumulator可以设置base的初始值以及定义一个二元操作符LongBinaryOperator进行额外操作

    • 🐳 DoubleAdder

      同LongAdder

    • 🐳 DoubleAccumulator

      同LongAccumulator


    • 🐳 LockSupport

      提供了park/unpark(Thread thread)等方法用来创建锁和其他同步工具类的基本线程阻塞原语
      与 wait/notify 相比,park/unpark 方法更贴近操作系统层面的阻塞与唤醒线程,并不需要获取锁/对象的监视器,通过获取许可证方式唤醒线程
      可先unpark(提前给线程许可证备用)后park,不同于Semaphores,许可证不可累加计算,至多一个,因此LockSupport是不可重入,多次调用park,后续多次调用unpark无法获取许可证

    • 🍼 Condition

      条件对象接口,常用的方法await()和signal/signalAll(),类似Object锁对象的wait()、notify/notifyAll()
      Object的wait()、notify/notifyAll()主要配合synchronized使用,Condition主要配合Lock[lock()/unlock()]使用。两者都需要配合锁(synchronized/lock)使用。park/unpark则无需锁,且先后顺序不强制

    • 🌲 AbstractOwnableSynchronizer

      设置/取消AQS中锁的持有者

    • 🌲 AbstractQueuedSynchronizer

      队列同步器(AQS),AQS继承了AbstractOwnableSynchronizer类。AQS包含了同步队列(通过park/unpark实现),条件队列(通过await/signal实现)的实现方法。

    • AbstractQueuedLongSynchronizer
    • 🐳 ReentrantLock

      可重入锁,包含了内部类公平锁Sync和非公平锁NonfairSync,这两个类都继承了AbstractQueuedSynchronizer方法实现同步队列和条件队列
      其中state被称为同步状态,state=0表明锁未被占用,state=1表明锁被线程占用,state>1表明锁支持可重入

    • 🐳 ReentrantReadWriteLock

      实现ReadWriteLock接口

    • StampedLock
    • 🍼 ReadWriteLock

      读/写锁抽象接口

    • 🍼 Lock

      含有方法lock()/unlock()等进行申请锁和释放锁


  • 并发容器
    • 🐳 ArrayBlockingQueue

      1.ArrayBlockingQueue 是一个用数组实现的环形队列,数组实现。一把锁,两个条件。因为只需要一把锁就可控制整个数组多线程操作
      2.当数组为空时,take会被阻塞。否则,take调用成功后会唤醒put的调用者。当数组满时,put会被阻塞。否则,put调用成功后会唤醒take的调用者

    • 🍼 BlockingQueue

      1.BlockingQueue是一个带阻塞功能的队列。入队列时,若队列已满,则阻塞调用者;出队列时,若队列为空,则阻塞调用者。
      2.实现类有ArrayBlockingQueue、LinkedBlockingQueue、PriorityQueue、SynchronousQueue

    • BlockingDeque
    • CopyOnWriteArrayList
    • CopyOnWriteArraySet
    • ConcurrentLinkedQueue
    • ConcurrentLinkedDeque
    • ConcurrentSkipListSet
    • ConcurrentMap
    • ConcurrentNavigableMap
    • ConcurrentHashMap
    • ConcurrentSkipListMap
    • 🍼 DelayQueue

      1.无界延迟队列,按延迟时间从小到大进行排序后,出入队.该类实现了Delayed接口。包含了一个锁和一个Condition条件
      2.只有出队时,当队首元素的(目标时间-当前时间>0)时,线程会被阻塞,否则会返回到期的队首元素。由于队列无界,入队不会阻塞线程,当新入队的元素成为队头,会调用signal唤醒某个线程。

    • 🍼 LinkedBlockingQueue

      1.LinkedBlockingQueue是一种基于单向链表的阻塞队列。因为队头和队尾是2个指针分开操作的,所以用了2把锁+2个条件,同时有1个AtomicInteger的原子变量记录count数。
      2.除了像ArrayBlockingQueue那样,put会通知take,take也会通知put。当put发现非满的时候,也会通知其他put线程;当take发现非空的时候,也会通知其他take线程。

    • LinkedBlockingDeque
    • 🍼 PriorityBlockingQueue

      1.优先级同步队列,使用数组实现二叉堆,从而完成排序功能,可自动扩容。内部包含一把锁+一个条件
      2.ArrayBlockingQueue是固定长度数组,当超出固定长度,put时需要被阻塞。而PriorityBlockingQueue在put时超过数组长度,自动扩容,因此put不会被阻塞,不需要条件,put后会唤醒take调用者。take数组为空时,会被阻塞等待put唤醒。因此只需要一个条件

    • PriorityQueue
    • 🐳 SynchronousQueue

      1.ThreadPoolExecutor内部实现任务提交的时候调用的是工作队列。使用SynchronousQueue的目的就是保证“对于提交的任务,如果有空闲线程,则使用空闲线程来处理;否则新建一个线程来处理任务”。
      2.put时,创建QNode结点,将该新结点放入到队列尾部,并将当前线程赋给新结点的waiter引用,值赋给item引用,然后阻塞创建的结点(此为ThreadPoolExecutor创建一个线程的过程)
      3.take时,从队列的头部开始寻找put放入的结点(称为put结点,isData=false),将put结点的值item=null,引用的等待线程waiter=null,并将删除旧结点,将put结点设置为新头结点(头结点是个傀儡结点)。最后唤醒put结点。put结点的返回item值,最后put结点跳出了for死循环。take结点返回put结点的item值,跳出了for死循环(此为ThreadPoolExecutor提交任务获取空闲线程的过程)
      4.最终put和take结点完成了匹配的过程



































































  • 反射元素-字段



















  • 日期时间-时钟