序号 | 图标 | 含义 |
---|---|---|
1 | 🌲 | 形似大写字母A,代表该类为抽象类(Abstract) |
2 | 🍼 | 形似小写字母i,代表该类为接口(interface) |
3 | 🐳 | 形似大写字母C,代表该类为普通类(Class) |
- 字符序列
- 🐳 StringBuilder
用于操作大量字符串且线程安全环境下
- 🐳 StringBuffer
用于操作大量字符串且线程非安全环境下。方法和StringBuilder相同,但使用synchronized修饰
- 🐳 String
使用final byte[]数组存储
- 🌲 AbstractStringBuilder
StringBuilder和StringBuffer的父类,封装了增删查改的实现方法
- 🍼 CharSequence
字符序列接口,封装了对字符序列(byte[])的查询、比较、转成流等操作
- Appendable
- Readable
- StringLatin1
- StringUTF16
- StringJoiner
- StringTokenizer
- StreamTokenizer
- 🐳 StringBuilder
- 包装
- 底层操作
- 🐳 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
- 🍼 Runnable
- 同步/并发
-
闭锁。基于AQS
1.类似开闸放水。state等于闸门数量,调用await()的线程即等待闸门的线程(主线程,可能多个),当state!=0说明还存在闸门,不能被放行,进入AQS的同步队列中被阻塞
2.调用countDown的线程即开闸门的线程(子线程),每调用一次countDown,闸门数state-1 3.当某个子线程在开闸门(state=state-1)过程中,发现更新后的state=0,则一次性唤醒在AQS的同步队列中所有主线程 -
同步屏障/循环栅栏,基于ReentrantLock+Condition实现,与AQS无关
1.设定parties值,表示容纳的最大线程数量。count初始值=parties
2.线程每调用await,count减1。当count!=0,线程被阻塞。当count=0时,signalAll所有线程
3.若某一个线程被中断或者阻塞时间到期,则栅栏失效,signalAll所有线程
4.CyclicBarrier可重复使用,当signalAll所有线程后,count再次被重新设定为parties值 -
计数信号量,基于AQS 设定阈值state。多线程可以申请锁,每申请一次state-1。每释放锁,state+1。只有state>0才可申请锁。
-
🍼 Executor
任务执行器,只包含execute(Runnable)方法,执行Runnable类型的任务
-
1.任务执行服务,用户向任务执行服务提交任务后,由任务执行服务调度、执行任务
2.典型的实现类为[任务池]ForkJoinPool与[线程池]ThreadPoolExecutor。 -
实现ExecutorService的抽象类,有两个重要子类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,采用拒绝策略处理新任务 -
🍼 Callable
1.该接口只有一个call()方法,表示有返回值的任务 2.与Runnable相似都表示执行的任务。区别在于该接口可以返回值,且可能抛出异常
-
🍼 Future
1.Future表示一类带有返回值、可异步执行的任务
2.可获取任务计算结果、取消任务, 调用get的线程,若任务未完成,会被阻塞 -
RunnableFuture表示兼容Runnable的带有异步计算的任务。该接口继承Runnable以及Future。是Runnable和Future的合体
-
1.FutureTask表示一类将来会被完成的异步任务,这类任务带有返回值,且中途可被取消。该类实现了RunnableFuture接口
2.该类提供了Runnable与Future的基本实现,包括启动和取消任务,查询任务是否结束,以及获取任务执行结果。
3.FutureTask涉及两类线程,一个是执行任务的线程,一个是获取任务结果的线程,前者只有一个,后者可以有多个。当任务还没完成时,获取任务结果的线程调用get,会被阻塞放入到栈中。当任务完成后,会唤醒栈中的所有线程 -
🍼 Delayed
1.Delayed是一个延时性接口,一般用来约束带有延时属性的任务或组件,该接口只有一个方法getDelay,以获取距任务触发还剩余的时间
2.Delayed接口继承了Comparable,因此接口的子类本身必须具备"可比较性" -
线程池的拒绝策略接口机类,开发人员可以实现该接口,自定义线程池的拒绝策略
-
Exchanger用于两个线程之间交换数据
-
- 原子操作
- 🐳 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
- 🐳 AtomicBoolean
- 锁
- 🐳 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()等进行申请锁和释放锁
- 🐳 LockSupport
- 并发容器
- 🐳 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结点完成了匹配的过程
- 🐳 ArrayBlockingQueue
- 常见字节输入流
- InputStream
- StringBufferInputStream
- ByteArrayInputStream
- FileInputStream
- SocketInputStream
- ChannelInputStream
- PipedInputStream
- SequenceInputStream
- FilterInputStream
- BufferedInputStream
- LineNumberInputStream
- PushbackInputStream
- DataInput
- DataInputStream
- ObjectInput
- ObjectInputStream
- CheckedInputStream
- DeflaterInputStream
- InflaterInputStream
- GZIPInputStream
- ZipInputStream
- JarInputStream
- 常见字节输出流
- OutputStream
- ByteArrayOutputStream
- FileOutputStream
- SocketOutputStream
- PipedOutputStream
- FilterOutputStream
- PrintStream
- BufferedOutputStream
- DataOutput
- DataOutputStream
- ObjectOutput
- ObjectOutputStream
- CheckedOutputStream
- InflaterOutputStream
- DeflaterOutputStream
- GZIPOutputStream
- ZipOutputStream
- JarOutputStream
- 常见字符输入流
- 常见字符输出流
- 序列化/反序列化
- 压缩/解压
- 清理器
- Cleaner (java.lang.ref)
- Cleaner (jdk.internal.ref)
- CleanerImpl
- PhantomCleanable
- SoftCleanable
- WeakCleanable
- CleanerFactory
- 字符(序列)编码/解码
- 字符集
- Charset
- StandardCharsets (java.nio.charset)
- StandardCharsets (sun.nio.cs)
- ExtendedCharsets
- CharsetProvider
- AbstractCharsetProvider
- CharacterData
- CharacterDataLatin1
- ConditionalSpecialCasing
- 文件操作选项
- 目录监视服务
- 文件过滤
- 文件属性
- 文件属性视图
- DynamicFileAttributeView
- AttributeView
- UserDefinedFileAttributeView
- AbstractUserDefinedFileAttributeView
- WindowsUserDefinedFileAttributeView
- FileAttributeView
- FileOwnerAttributeView
- FileOwnerAttributeViewImpl
- PosixFileAttributeView
- AclFileAttributeView
- AbstractAclFileAttributeView
- WindowsAclFileAttributeView
- BasicFileAttributeView
- AbstractBasicFileAttributeView
- DosFileAttributeView
- WindowsFileAttributeViews
- FileStoreAttributeView
- AclEntry
- AclEntryType
- AclEntryPermission
- AclEntryFlag
- UserPrincipal
- GroupPrincipal
- UserPrincipalLookupService
- 文件系统提供器
- 文件系统
- FileSystems
- FileSystem (java.io)
- WinNTFileSystem
- DefaultFileSystem
- FileSystem (java.nio.file)
- WindowsFileSystem
- 文件工具
- 网络-地址
- 网络-TCP
- 网络-UDP
- 网络-参数
- SocketOption
- SocketOptions
- ExtendedSocketOption
- StandardSocketOptions
- ExtendedSocketOptions (sun.net.ext)
- ExtendedSocketOptions (jdk.net)
- SocksConsts
- 通道-工厂
- 通道-分类
- Channel
- ReadableByteChannel
- WritableByteChannel
- ByteChannel
- SeekableByteChannel
- NetworkChannel
- MulticastChannel
- SelChImpl
- ScatteringByteChannel
- GatheringByteChannel
- InterruptibleChannel
- AbstractInterruptibleChannel
- SelectableChannel
- AbstractSelectableChannel
- AsynchronousChannel
- AsynchronousByteChannel
- Groupable
- Cancellable (sun.nio.ch)
- 通道-文件-文件锁
- 通道-文件-同步
- 通道-Socket适配器-同步
- 通道-文件-异步
- 通道-TCP-异步
- 通道选择器-管道
- 通道选择器-工具
- 通道选择器-选择键
- URL
- URL-连接
- URLConnection (java.net)
- URLConnection (sun.net.www)
- FileURLConnection
- URL-协议处理
- URI
- 类加载器
- 反射元素访问器
- MethodAccessorGenerator
- ConstructorAccessor
- ConstructorAccessorImpl
- DelegatingConstructorAccessorImpl
- NativeConstructorAccessorImpl
- SerializationConstructorAccessorImpl
- InstantiationExceptionConstructorAccessorImpl
- BootstrapConstructorAccessorImpl
- MethodAccessor
- MethodAccessorImpl
- DelegatingMethodAccessorImpl
- NativeMethodAccessorImpl
- FieldAccessor
- 反射元素-模块
- 反射元素-包
- 反射元素-字段
- 反射元素-构造器
- 反射元素-方法
- 反射元素-形参
- 反射元素-注解
- 比较
- 容器/集合框架
- Collection
- AbstractCollection
- Collections
- RandomAccess
- ImmutableCollections
- CollSer
- List
- AbstractList
- AbstractSequentialList
- ArrayList
- LinkedList
- Vector
- ListIterator
- Queue
- Deque
- TransferQueue
- AbstractQueue
- ArrayDeque
- LinkedTransferQueue
- Set
- SortedSet
- NavigableSet
- AbstractSet
- HashSet
- LinkedHashSet
- TreeSet
- EnumSet
- RegularEnumSet
- JumboEnumSet
- Map
- SortedMap
- NavigableMap
- AbstractMap
- HashMap
- LinkedHashMap
- TreeMap
- IdentityHashMap
- WeakHashMap
- EnumMap
- Dictionary
- Hashtable
- KeyValueHolder
- PreHashedMap
- BitSet
- 日期时间
- 日期时间-工具
- 日期时间-时区
- 日期时间-历法系统
- 日期时间-时间段
- 日期时间-时间戳
- 日期时间-时钟
- 流
- 水槽
- 流-操作
- 流-工具
- 流-参数
- 缓冲区
- Buffer
- DirectBuffer
- char缓冲区
- byte缓冲区
- short缓冲区
- int缓冲区
- long缓冲区
- float缓冲区
- double缓冲区
- 缓冲区-工具
- CharBufferSpliterator
- Bits (java.nio)
- Lambda表达式
- Function
- IntFunction
- LongFunction
- DoubleFunction
- IntToLongFunction
- IntToDoubleFunction
- LongToIntFunction
- LongToDoubleFunction
- DoubleToIntFunction
- DoubleToLongFunction
- ToIntFunction
- ToLongFunction
- ToDoubleFunction
- BiFunction
- ToIntBiFunction
- ToLongBiFunction
- ToDoubleBiFunction
- UnaryOperator
- IntUnaryOperator
- LongUnaryOperator
- DoubleUnaryOperator
- BinaryOperator
- IntBinaryOperator
- LongBinaryOperator
- DoubleBinaryOperator
- Consumer
- Predicate
- Supplier
- Function
- 注解处理器
- Java语言模型
- AnnotatedConstruct
- SourceVersion
- 类型
- 元素
- 访问器
- TypeVisitor
- AbstractTypeVisitor6
- AbstractTypeVisitor7
- AbstractTypeVisitor8
- AbstractTypeVisitor9
- SimpleTypeVisitor6
- SimpleTypeVisitor7
- SimpleTypeVisitor8
- SimpleTypeVisitor9
- TypeKindVisitor6
- TypeKindVisitor7
- TypeKindVisitor8
- TypeKindVisitor9
- ElementVisitor
- AbstractElementVisitor6
- AbstractElementVisitor7
- AbstractElementVisitor8
- AbstractElementVisitor9
- SimpleElementVisitor6
- SimpleElementVisitor7
- SimpleElementVisitor8
- SimpleElementVisitor9
- ElementKindVisitor6
- ElementKindVisitor7
- ElementKindVisitor8
- ElementKindVisitor9
- ElementScanner6
- ElementScanner7
- ElementScanner8
- ElementScanner9
- AnnotationValueVisitor
- AbstractAnnotationValueVisitor6
- AbstractAnnotationValueVisitor7
- AbstractAnnotationValueVisitor8
- AbstractAnnotationValueVisitor9
- SimpleAnnotationValueVisitor6
- SimpleAnnotationValueVisitor7
- SimpleAnnotationValueVisitor8
- SimpleAnnotationValueVisitor9
- 资源
- 时间日期
- 不常用工具
- Bits (java.io)
- Preconditions
- Tripwire (java.util)
- Tripwire (java.util.stream)
- Resources
- WeakPairMap
- Reflection
- ReflectUtil
- Shutdown
- ApplicationShutdownHooks
- 未分类