流 Stream
- 几个关键概念
- 流来源有一种称为 Spliterator 的抽象来描述
- 流标志:在内部表示中,管道的每个阶段都通过一个流标志 位图来描述,该位图描述了在流管道的这一阶段已知的元素信息。流使用这些标志优化流的构造和执行
表 1. 流标志
流标志 | 解释 |
---|---|
SIZED |
流的大小已知。 |
DISTINCT |
依据用于对象流的 Object.equals() 或用于原语流的 == ,流的元素将有所不同。 |
SORTED |
流的元素按自然顺序排序。 |
ORDERED |
流有一个有意义的遇到顺序(请参阅 “遇到顺序” 部分)。 |
来源阶段的流标志来自 spliterator 的 characteristics
位图(spliterator 支持比流更大的标志集)。高质量的 spliterator 实现不仅提供了高效的元素访问和拆分,还会描述元素的特征。(例如,一个HashSet
的 spliterator 报告 DISTINCT
特征,因为已知一个 Set
的元素是不同的。)
- 遇到顺序
如果流有一个已定义的遇到顺序,但该顺序对结果没有意义,那么可以通过使用 unordered() 操作删除 ORDERED 标志,加速包含顺序敏感型操作的管道的顺序执行。
AQS
几个关键点
-- head处于2个状态:
没有线程(初始化时,获得锁的线程在外边,新建的CLH队列是初始化的一个node) 或者 head中的线程是获得锁在运行的状态(因为位于第2个位置的node在获得锁后会将自己设置为head)
--竞争线程所在的node:
会死循环的尝试将自己放在一个状态<=0的节点后边,且会cas将那个节点的状态设置为signal。
-- 尾插法:
新来的竞争线程,如果不能非公平的在第一次就能拿到锁的话,就会被放入CLH,且cas作为tail。
-- 被unpark的线程:会继续在死循环里循环,看自己是否能获得锁。不能的话继续park。循环里的条件是好的参考资料,注意其有 上篇 下篇 要多翻翻
https://www.cnblogs.com/iou123lg/p/9637637.html-
图