1 目录 1
2 JVM 19
21 线程 20
22 JVM 存区域 21
221 程序计数器(线程私) 22
222 虚拟机栈(线程私) 22
223 方法区(线程私) 23
224 堆(Heap线程享)运行时数区 23
225 方法区永久代(线程享) 23
23 JVM 运行时存 24
231 新生代 24
2311 Eden 区 24
2312 ServivorFrom 24
2313 ServivorTo 24
2314 MinorGC 程(复制>清空>互换) 24
1:edenservicorFrom 复制 ServicorTo年龄+1 25
2:清空 edenservicorFrom 25
3:ServicorTo ServicorFrom 互换 25
232 老年代 25
233 永久代 25
2331 JAVA8 元数 25
24 垃圾回收算法 26
241 确定垃圾 26
2411 引计数法 26
2412 达性分析 26
242 标记清算法(MarkSweep) 27
243 复制算法(copying) 27
244 标记整理算法(MarkCompact) 28
245 分代收集算法 29
2451 新生代复制算法 29
2452 老年代标记复制算法 29
25 JAVA 四中引类型 30
251 强引 30
252 软引 30
253 弱引 30
254 虚引 30
26 GC 分代收集算法 VS 分区收集算法 30
261 分代收集算法 30
2611 新生代复制算法 30
2612 老年代标记整理算法 30
262 分区收集算法 31
27 GC 垃圾收集器 31
271 Serial 垃圾收集器(单线程复制算法) 31
272 ParNew 垃圾收集器(Serial+线程) 31
273 Parallel Scavenge 收集器(线程复制算法高效) 32
274 Serial Old 收集器(单线程标记整理算法 ) 32
275 Parallel Old 收集器(线程标记整理算法) 33
276 CMS 收集器(线程标记清算法) 33
2761 初始标记 33 13042018 Page 2 of 283
2762 发标记 34
2763 重新标记 34
2764 发清 34
277 G1 收集器 34
28 JAVA IONIO 34
281 阻塞 IO 模型 34
282 非阻塞 IO 模型 35
283 路复 IO 模型 35
284 信号驱动 IO 模型 36
285 异步 IO 模型 36
281 JAVA IO 包 36
282 JAVA NIO 37
2821 NIO 缓区 38
2822 NIO 非阻塞 38
283 Channel 40
284 Buffer 40
285 Selector 40
29 JVM 类加载机制 41
2911 加载 41
2912 验证 41
2913 准备 41
2914 解析 41
2915 符号引 42
2916 直接引 42
2917 初始化 42
2918 类构造器
292 类加载器 42
2921 启动类加载器(Bootstrap ClassLoader) 43
2922 扩展类加载器(Extension ClassLoader) 43
2923 应程序类加载器(Application ClassLoader): 43
293 双亲委派 43
294 OSGI(动态模型系统) 44
2941 动态改变构造 44
2942 模块化编程热插拔 44
3 JAVA 集合 45
31 接口继承关系实现 45
32 LIST 47
321 ArrayList(数组) 47
322 Vector(数组实现线程步) 47
323 LinkList(链表) 47
33 SET 48
3311 HashSet(Hash 表) 48
3312 TreeSet(二叉树) 49
3313 LinkHashSet(HashSet+LinkedHashMap) 49
34 MAP 50
341 HashMap(数组+链表+红黑树) 50
3411 JAVA7 实现 50
3412 JAVA8 实现 51
342 ConcurrentHashMap 51
3421 Segment 段 51
3422 线程安全(Segment 继承 ReentrantLock 加锁) 51
3423 行度(默认 16) 52
3424 Java8 实现 (引入红黑树) 52 13042018 Page 3 of 283
343 HashTable(线程安全) 53
344 TreeMap(排序) 53
345 LinkHashMap(记录插入序) 53
4 JAVA 线程发 54
411 JAVA 发知识库 54
412 JAVA 线程实现创建方式 54
4121 继承 Thread 类 54
4122 实现 Runnable 接口 54
4123 ExecutorServiceCallable
4124 基线程池方式 56
413 4 种线程池 56
4131 newCachedThreadPool 57
4132 newFixedThreadPool 57
4133 newScheduledThreadPool 58
4134 newSingleThreadExecutor 58
414 线程生命周期(状态) 58
4141 新建状态(NEW) 58
4142 绪状态(RUNNABLE): 59
4143 运行状态(RUNNING): 59
4144 阻塞状态(BLOCKED): 59
等阻塞(owait>等列): 59
步阻塞(lock>锁池) 59
阻塞(sleepjoin) 59
4145 线程死亡(DEAD) 59
正常结束 59
异常结束 59
调 stop 59
415 终止线程 4 种方式 60
4151 正常运行结束 60
4152 退出标志退出线程 60
4153 Interrupt 方法结束线程 60
4154 stop 方法终止线程(线程安全) 61
416 sleep wait 区 61
417 start run 区 62
418 JAVA 台线程 62
419 JAVA 锁 63
4191 乐观锁 63
4192 悲观锁 63
4193 旋锁 63
旋锁优缺点 63
旋锁时间阈值(16 引入适应性旋锁) 63
旋锁开启 64
4194 Synchronized 步锁 64
Synchronized 作范围 64
Synchronized 核心组件 64
Synchronized 实现 64
4195 ReentrantLock 66
Lock 接口方法 66
非公锁 66
公锁 67
ReentrantLock synchronized 67
ReentrantLock 实现 67
Condition 类 Object 类锁方法区区 68
tryLock lock lockInterruptibly 区 68
4196 Semaphore 信号量 68
实现互斥锁(计数器 1) 68
代码实现 68
Semaphore ReentrantLock 69
4197 AtomicInteger 69 13042018 Page 4 of 283
4198 重入锁(递锁) 69
4199 公锁非公锁 70
公锁(Fair) 70
非公锁(Nonfair) 70
41910 ReadWriteLock 读写锁 70
读锁 70
写锁 70
41911 享锁独占锁 70
独占锁 70
享锁 70
41912 重量级锁(Mutex Lock) 71
41913 轻量级锁 71
锁升级 71
41914 偏锁 71
41915 分段锁 71
41916 锁优化 71
减少锁持时间 72
减锁粒度 72
锁分离 72
锁粗化 72
锁消 72
4110 线程基方法 72
41101 线程等(wait) 73
41102 线程睡眠(sleep) 73
41103 线程步(yield) 73
41104 线程中断(interrupt) 73
41105 Join 等线程终止 74
41106 什 join()方法? 74
41107 线程唤醒(notify) 74
41108 方法: 74
4111 线程文切换 75
41111 进程 75
41112 文 75
41113 寄存器 75
41114 程序计数器 75
41115 PCB切换桢 75
41116 文切换活动: 76
41117 引起线程文切换原 76
4112 步锁死锁 76
41121 步锁 76
41122 死锁 76
4113 线程池原理 76
41131 线程复 76
41132 线程池组成 76
41133 拒绝策略 78
41134 Java 线程池工作程 78
4114 JAVA 阻塞队列原理 79
41141 阻塞队列方法 80
插入操作: 80
获取数操作: 81
41142 Java 中阻塞队列 81
41143 ArrayBlockingQueue(公非公) 82
41144 LinkedBlockingQueue(两独立锁提高发) 82
41145 PriorityBlockingQueue(compareTo 排序实现优先) 82
41146 DelayQueue(缓存失效定时务 ) 82
41147 SynchronousQueue(存储数传递数) 83
41148 LinkedTransferQueue 83 13042018 Page 5 of 283
41149 LinkedBlockingDeque 83
4115 CyclicBarrierCountDownLatchSemaphore 法 84
41151 CountDownLatch(线程计数器 ) 84
41152 CyclicBarrier(回环栅栏等 barrier 状态全部时执行) 84
41153 Semaphore(信号量控制时访问线程数) 85
4116 volatile 关键字作(变量见性禁止重排序) 87
变量见性 87
禁止重排序 87
sychronized 更轻量级步锁 87
适场景 87
4117 两线程间享数 88
数抽象成类数操作作类方法 88
Runnable 象作类部类 89
4118 ThreadLocal 作(线程存储) 90
ThreadLocalMap(线程属性) 90
场景 91
4119 synchronized ReentrantLock 区 91
41191 两者点: 91
41192 两者点: 92
4120 ConcurrentHashMap 发 92
41201 减锁粒度 92
41202 ConcurrentHashMap 分段锁 92
ConcurrentHashMap Segment 数组结构 HashEntry 数组结构组成 93
4121 Java 中线程调度 93
41211 抢占式调度: 93
41212 协式调度: 93
41213 JVM 线程调度实现(抢占式调度) 94
41214 线程出 cpu 情况: 94
4122 进程调度算法 94
41221 优先调度算法 94
41222 高优先权优先调度算法 95
41223 基时间片轮转调度算法 96
4123 什 CAS(较交换乐观锁机制锁旋) 96
41231 概念特性 96
41232 原子包 javautilconcurrentatomic(锁旋) 97
41233 ABA 问题 98
4124 什 AQS(抽象队列步器) 98
Exclusive 独占资源ReentrantLock 99
Share 享资源SemaphoreCountDownLatch 99
步器实现 ABS 核心(state 资源状态计数) 100
ReentrantReadWriteLock 实现独占享两种方式 100
5 JAVA 基础 101
511 JAVA 异常分类处理 101
5111 概念 101
5112 异常分类 101
Error 101
Exception(RuntimeExceptionCheckedException) 101
5113 异常处理方式 102
遇问题进行具体处理继续抛调者 (throwthrows) 102
try catch 捕获异常针性处理方式 102
5114 Throw throws 区: 102 13042018 Page 6 of 283
位置 102
功: 102
512 JAVA 反射 103
5121 动态语言 103
5122 反射机制概念 (运行状态中知道类属性方法) 103
5123 反射应场合 103
编译时类型运行时类型 103
编译时类型法获取具体方法 104
5124 Java 反射 API 104
反射 API 生成 JVM 中类接口象信息 104
5125 反射步骤(获取 Class 象调象方法) 104
5126 获取 Class 象 3 种方法 104
调某象 getClass()方法 104
调某类 class 属性获取该类应 Class 象 104
Class 类中 forName()静态方法(安全性) 104
5127 创建象两种方法 105
Class 象 newInstance() 105
调 Constructor 象 newInstance() 105
513 JAVA 注解 106
5131 概念 106
5132 4 种标准元注解 106
@Target 修饰象范围 106
@Retention 定义 保留时间长短 106
@Documented 描述javadoc 106
@Inherited 阐述某标注类型继承 106
5133 注解处理器 107
514 JAVA 部类 109
5141 静态部类 109
5142 成员部类 110
5143 局部部类(定义方法中类) 110
5144 匿名部类(继承父类者实现接口直接 new 生成象引) 111
515 JAVA 泛型 112
5151 泛型方法(
5152 泛型类
5153 类型通配符 113
5154 类型擦 113
516 JAVA 序列化(创建复 Java 象) 113
保存(持久化)象状态存者磁盘 113
序列化象字节数组保持静态成员保存 113
序列化户远程象传输 113
Serializable 实现序列化 113
ObjectOutputStream ObjectInputStream 象进行序列化反序列化 113
writeObject readObject 定义序列化策略 113
序列化 ID 113
序列化保存静态变量 114
序列化子父类说明 114
Transient 关键字阻止该变量序列化文件中 114
517 JAVA 复制 114
5171 直接赋值复制 114
5172 浅复制(复制引复制引象) 114
5173 深复制(复制象应象) 115
5174 序列化(深 clone 中实现) 115
6 SPRING 原理 116
611 Spring 特点 116
6111 轻量级 116 13042018 Page 7 of 283
6112 控制反转 116
6113 面切面 116
6114 容器 116
6115 框架集合 116
612 Spring 核心组件 117
613 Spring 常模块 117
614 Spring 包 118
615 Spring 常注解 118
616 Spring 第三方结合 119
617 Spring IOC 原理 120
6171 概念 120
6172 Spring 容器高层视图 120
6173 IOC 容器实现 120
BeanFactory框架基础设施 120
11111 BeanDefinitionRegistry 注册表 121
11112 BeanFactory 顶层接口 121
11113 ListableBeanFactory 121
11114 HierarchicalBeanFactory 父子级联 121
11115 ConfigurableBeanFactory 121
11116 AutowireCapableBeanFactory 动装配 122
11117 SingletonBeanRegistry 运行期间注册单例 Bean 122
11118 赖日志框框 122
ApplicationContext 面开发应 122
WebApplication 体系架构 123
6174 Spring Bean 作域 123
singleton:单例模式(线程安全) 123
prototype原型模式次时创建 124
Request:次 request 实例 124
session 124
global Session 124
6175 Spring Bean 生命周期 124
实例化 124
IOC 赖注入 124
setBeanName 实现 124
BeanFactoryAware 实现 124
ApplicationContextAware 实现 125
postProcessBeforeInitialization 接口实现初始化预处理 125
initmethod 125
postProcessAfterInitialization 125
Destroy 期动清理阶段 125
destroymethod 配置清理 125
6176 Spring 赖注入四种方式 126
构造器注入 126
setter 方法注入 127
静态工厂注入 127
实例工厂 127
6177 5 种方式动装配 128
618 Spring APO 原理 129
6181 概念 129
6182 AOP 核心概念 129
6181 AOP 两种代理方式 130
JDK 动态接口代理 130
CGLib 动态代理 131
6182 实现原理 131
619 Spring MVC 原理 132
6191 MVC 流程 132
Http 请求 DispatcherServlet 133
HandlerMapping 寻找处理器 133
调处理器 Controller 133 13042018 Page 8 of 283
Controller 调业务逻辑处理返回 ModelAndView 133
DispatcherServlet 查询 ModelAndView 133
ModelAndView 反馈浏览器 HTTP 133
6191 MVC 常注解 133
6110 Spring Boot 原理 134
1 创建独立 Spring 应程序 134
2 嵌入 Tomcat需部署 WAR 文件 134
3 简化 Maven 配置 134
4 动配置 Spring 134
5 提供生产绪型功指标健康检查外部配置 134
6 绝没代码生成 XML 没求配置 [1] 134
6111 JPA 原理 134
61111 事务 134
61112 事务 134
61111 分布式事务 135
61111 两阶段提交 136
1 准备阶段 136
2 提交阶段: 136
6112 Mybatis 缓存 137
61121 Mybatis 级缓存原理(sqlsession 级) 138
61122 二级缓存原理(mapper 基) 138
具体需配置: 139
6113 Tomcat 架构 139
7 微服务 140
711 服务注册发现 140
7111 客户端注册(zookeeper) 140
7112 第三方注册(独立服务 Registrar) 140
7113 客户端发现 141
7114 服务端发现 142
7115 Consul 142
7116 Eureka 142
7117 SmartStack 142
7118 Etcd 142
712 API 网关 142
7121 请求转发 143
7122 响应合 143
7123 协议转换 143
7124 数转换 143
7125 安全认证 144
713 配置中心 144
7131 zookeeper 配置中心 144
7132 配置中心数分类 144
714 事件调度(kafka) 144
715 服务踪(startersleuth) 144
716 服务熔断(Hystrix) 145
7161 Hystrix 断路器机制 146
717 API 理 146
8 NETTY RPC 147
811 Netty 原理 147
812 Netty 高性 147
8121 路复通讯方式 147
8121 异步通讯 NIO 148
8122 零拷贝(DIRECT BUFFERS 堆外直接存) 149
8123 存池(基存池缓区重机制) 149
8124 高效 Reactor 线程模型 149
Reactor 单线程模型 149
Reactor 线程模型 150 13042018 Page 9 of 283
Reactor 线程模型 150
8125 锁设计线程绑定 151
8126 高性序列化框架 151
包封包防止网络阻塞 152
软中断 Hash 值 CPU 绑定 152
813 Netty RPC 实现 152
8131 概念 152
8132 关键技术 152
8133 核心流程 152
8131 消息编解码 153
息数结构(接口名称+方法名+参数类型参数值+超时时间+ requestID) 153
序列化 154
8131 通讯程 154
核心问题(线程暂停消息乱序) 154
通讯流程 154
requestID 生成AtomicLong 154
存放回调象 callback 全局 ConcurrentHashMap 154
synchronized 获取回调象 callback 锁旋 wait 154
监听消息线程收消息找 callback 锁唤醒 155
814 RMI 实现方式 155
8141 实现步骤 155
815 Protoclol Buffer 156
8151 特点 157
816 Thrift 157
9 网络 159
911 网络 7 层架构 159
912 TCPIP 原理 160
9121 网络访问层(Network Access Layer) 160
9122 网络层(Internet Layer) 160
9123 传输层(Tramsport LayerTCPUDP) 160
9124 应层(Application Layer) 160
913 TCP 三次握手四次挥手 161
9131 数包说明 161
9132 三次握手 162
9133 四次挥手 163
914 HTTP 原理 164
9141 传输流程 164
1:址解析 164
2:封装 HTTP 请求数包 165
3:封装成 TCP 包建立连接 165
4:客户机发送请求命 165
5:服务器响应 165
6:服务器关闭 TCP 连接 165
9142 HTTP 状态 165
9143 HTTPS 166
建立连接获取证书 167
证书验证 167
数加密传输 167
915 CDN 原理 167
9151 分发服务系统 167
9152 负载均衡系统: 168
9153 理系统: 168
10 日志 169
1011 Slf4j 169
1012 Log4j 169
1013 LogBack 169
10131 Logback 优点 169
1014 ELK 170 13042018 Page 10 of 283
11 ZOOKEEPER 171
1111 Zookeeper 概念 171
1111 Zookeeper 角色 171
11111 Leader 171
11112 Follower 171
11113 Observer 171
11111 ZAB 协议 172
事务编号 Zxid(事务请求计数器+ epoch) 172
epoch 172
Zab 协议两种模式恢复模式(选)广播模式(步) 172
ZAB 协议 4 阶段 172
Leader election(选举阶段选出准 Leader) 172
Discovery(发现阶段接受提议生成 epoch接受 epoch) 173
Synchronization(步阶段步 follower 副) 173
Broadcast(广播阶段leader 消息广播) 173
ZAB 协议 JAVA 实现(FLE发现阶段步合 Recovery Phase(恢复阶段)) 173
11112 投票机制 173
1112 Zookeeper 工作原理(原子广播) 174
1113 Znode 四种形式目录节点 174
12 KAFKA 175
1211 Kafka 概念 175
1212 Kafka 数存储设计 175
12121 partition 数文件(offsetMessageSizedata) 175
12122 数文件分段 segment(序读写分段命令二分查找) 176
12123 数文件索引(分段索引稀疏存储) 176
1213 生产者设计 176
12131 负载均衡(partition 会均衡分布 broker ) 176
12132 批量发送 177
12133 压缩(GZIP Snappy) 177
1211 消费者设计 177
12111 Consumer Group 178
13 RABBITMQ 179
1311 概念 179
1312 RabbitMQ 架构 179
13121 Message 180
13122 Publisher 180
13123 Exchange(消息路队列 ) 180
13124 Binding(消息队列交换器间关联) 180
13125 Queue 180
13126 Connection 180
13127 Channel 180
13128 Consumer 180
13129 Virtual Host 180
131210 Broker 181
1313 Exchange 类型 181
13131 Direct 键(routing key)分布: 181
13132 Fanout(广播分发) 181
13133 topic 交换器(模式匹配) 182 13042018 Page 11 of 283
14 HBASE 183
1411 概念 183
1412 列式存储 183
1413 Hbase 核心概念 184
14131 Column Family 列族 184
14132 Rowkey(Rowkey 查询Rowkey 范围扫描全表扫描) 184
14133 Region 分区 184
14134 TimeStamp 版 184
1414 Hbase 核心架构 184
14141 Client: 185
14142 Zookeeper: 185
14143 Hmaster 185
14144 HregionServer 185
14145 Region 寻址方式(通 zookeeper META) 186
14146 HDFS 186
1415 Hbase 写逻辑 187
14151 Hbase 写入流程 187
获取 RegionServer 187
请求写 Hlog 187
请求写 MemStore 187
14152 MemStore 刷盘 187
全局存控制 188
MemStore 达限 188
RegionServer Hlog 数量达限 188
手工触发 188
关闭 RegionServer 触发 188
Region HLOG 恢复完数触发 188
1416 HBase vs Cassandra 188
15 MONGODB 190
1511 概念 190
1512 特点 190
16 CASSANDRA 192
1611 概念 192
1612 数模型 192
Key Space(应 SQL 数库中 database) 192
Key(应 SQL 数库中键) 192
column(应 SQL 数库中列) 192
super column(SQL 数库支持) 192
Standard Column Family(相应 SQL 数库中 table) 192
Super Column Family(SQL 数库支持) 192
1613 Cassandra 致 Hash 虚拟节点 192
致性 Hash(米诺 down 机) 192
虚拟节点(down 机节点托) 193
1614 Gossip 协议 193
Gossip 节点通信方式收敛性 194
Gossip 两节点(AB)间存三种通信方式(pushpullpush&pull) 194
gossip 协议 seed list(防止集群分列) 194
1615 数复制 194
Partitioners(计算 primary key token hash 函数) 194
两种复制策略: 194
SimpleStrategy:仅单数中心 194
第 replica 放 partitioner 确定节点中余 replicas 放述节点时针方续节
点中 194 13042018 Page 12 of 283
NetworkTopologyStrategy:较复杂数中心 194
指定数中心分存储少份 replicas 194
1616 数写请求协调者 195
协调者(coordinator) 195
1617 数读请求台修复 195
1618 数存储(CommitLogMemTableSSTable) 196
SSTable 文件构成(BloomFilterindexdatastatic) 196
1619 二级索引(索引 value 摘生成 RowKey) 196
16110 数读写 197
数写入更新(数追加) 197
数写删效率极高 197
错误恢复简单 197
读复杂度高 197
数删(column 墓碑) 197
墓碑 198
垃圾回收 compaction 198
数读取(memtable+SStables) 198
行缓存键缓存请求流程图 199
Row Cache(SSTables 中频繁访问数) 199
Bloom Filter(查找数应 SSTable) 200
Partition Key Cache(查找数应 Partition key) 200
Partition Summary(存中存储 partition index 样) 200
Partition Index(磁盘中) 200
Compression offset map(磁盘中) 200
17 设计模式 201
1711 设计原 201
1712 工厂方法模式 201
1713 抽象工厂模式 201
1714 单例模式 201
1715 建造者模式 201
1716 原型模式 201
1717 适配器模式 201
1718 装饰器模式 201
1719 代理模式 201
17110 外观模式 201
17111 桥接模式 201
17112 组合模式 201
17113 享元模式 201
17114 策略模式 201
17115 模板方法模式 201
17116 观察者模式 201
17117 迭代子模式 201
17118 责链模式 201
17119 命令模式 201
17120 备忘录模式 201
17121 状态模式 202
17122 访问者模式 202
17123 中介者模式 202
17124 解释器模式 202
18 负载均衡 203
1811 四层负载均衡 vs 七层负载均衡 203
18111 四层负载均衡(目标址端口交换) 203
F5:硬件负载均衡器功成高 203
lvs:重量级四层负载软件 203
nginx:轻量级四层负载软件带缓存功正表达式较灵活 203 13042018 Page 13 of 283
haproxy:模拟四层转发较灵活 203
18112 七层负载均衡(容交换) 203
haproxy:天生负载均衡技全面支持七层代理会话保持标记路径转移 204
nginx: http 协议 mail 协议功较性 haproxy 差 204
apache:功较差 204
Mysql proxy:功尚 204
1812 负载均衡算法策略 204
18121 轮循均衡(Round Robin) 204
18122 权重轮循均衡(Weighted Round Robin) 204
18123 机均衡(Random) 204
18124 权重机均衡(Weighted Random) 204
18125 响应速度均衡(Response Time 探测时间) 204
18126 少连接数均衡(Least Connection) 205
18127 处理力均衡(CPU存) 205
18128 DNS 响应均衡(Flash DNS) 205
18129 哈希算法 205
181210 IP 址散列(保证客户端服务器应关系稳定) 205
181211 URL 散列 205
1813 LVS 206
18131 LVS 原理 206
IPVS 206
18131 LVS NAT 模式 207
18132 LVS DR 模式(局域网改写 mac 址) 208
18133 LVS TUN 模式(IP 封装跨网段) 209
18134 LVS FULLNAT 模式 210
1814 Keepalive 211
1815 Nginx 反代理负载均衡 211
18151 upstream_module 健康检测 212
18151 proxy_pass 请求转发 212
1816 HAProxy 213
19 数库 214
1911 存储引擎 214
19111 概念 214
19112 InnoDB(B+树) 214
19113 TokuDB(Fractal Tree节点带数) 215
19114 MyIASM 215
19115 Memory 215
1912 索引 215
19121 常见索引原 216
1选择唯性索引 216
2常需排序分组联合操作字段建立索引: 216
3.常作查询条件字段建立索引 216
4.限制索引数目: 216
量数量少索引 216
量前缀索引 216
7.删者少索引 216
8 左前缀匹配原非常重原 216
10 量选择区分度高列作索引 216
11 索引列参计算保持列干净:带函数查询参索引 216
12 量扩展索引新建索引 216
1913 数库三范式 216
19131 第范式(1st NF -列分) 216
19132 第二范式(2nd NF-表描述件事情) 216
19133 第三范式(3rd NF- 存非键列传递赖) 217
1914 数库事务 217 13042018 Page 14 of 283
原子性(Atomicity) 217
致性(Consistency) 217
隔离性(Isolation) 218
永久性(Durability) 218
1915 存储程(特定功 SQL 语句集) 218
存储程优化思路: 218
1916 触发器(段动执行程序) 218
1917 数库发策略 218
19171 乐观锁 218
19172 悲观锁 219
19173 时间戳 219
1918 数库锁 219
19181 行级锁 219
19182 表级锁 219
19181 页级锁 219
1919 基 Redis 分布式锁 219
19110 分区分表 220
垂直切分(功模块) 220
水切分(规划分存储) 220
19111 两阶段提交协议 220
191111 准备阶段 221
191112 提交阶段 221
191113 缺点 221
步阻塞问题 221
单点障 221
数致(脑裂问题) 221
二阶段法解决问题(数状态确定) 221
19112 三阶段提交协议 222
191121 CanCommit 阶段 222
191122 PreCommit 阶段 222
191123 doCommit 阶段 222
19113 柔性事务 222
191131 柔性事务 222
两阶段型 222
补偿型 222
异步确保型 223
努力通知型(次尝试) 223
19114 CAP 224
致性(C): 224
性(A): 224
分区容忍性(P): 224
20 致性算法 225
2011 Paxos 225
Paxos 三种角色:ProposerAcceptorLearners 225
Proposer: 225
Acceptor: 225
Learner: 225
Paxos 算法分两阶段具体: 225
阶段(准 leader 确定 ): 225
阶段二(leader 确认): 225
2012 Zab 225
1崩溃恢复: Leader 选举程 226
2数步:Leader 服务器服务器进行数步 226
3消息广播:Leader 服务器数发送服务器 226
2013 Raft 226
20131 角色 226
Leader(领导者日志理) 226
Follower(追者日志步) 226
Candidate(候选者负责选票) 226 13042018 Page 15 of 283
20132 Term(期) 226
20133 选举(Election) 227
选举定时器 227
20134 安全性(Safety) 227
20135 raft 协议 zab 协议区 227
2014 NWR 228
N:分布式存储系统中少份备份数 228
W:代表次成功更新操作求少 w 份数写入成功 228
R: 代表次成功读数操作求少 R 份数成功读取 228
2015 Gossip 228
2016 致性 Hash 229
20161 致性 Hash 特性 229
20162 致性 Hash 原理 229
1建构环形 hash 空间: 229
2需缓存容(象)映射 hash 空间 229
3服务器(节点)映射 hash 空间 229
4象映射服务节点 229
考察 cache 变动 230
虚拟节点 230
21 JAVA 算法 232
2111 二分查找 232
2112 泡排序算法 232
2113 插入排序算法 233
2114 快速排序算法 234
2111 希尔排序算法 236
2112 排序算法 237
2113 桶排序算法 240
2114 基数排序算法 241
2115 剪枝算法 243
2116 回溯算法 243
2117 短路径算法 243
2118 子数组算法 243
2119 长公子序算法 243
21110 生成树算法 243
22 数结构 245
2211 栈(stack) 245
2212 队列(queue) 245
2213 链表(Link) 245
2214 散列表(Hash Table) 246
2215 排序二叉树 246
22151 插入操作 246
22152 删操作 247
22153 查询操作 248
2216 红黑树 248
22161 红黑树特性 248
22161 左旋 248
22161 右旋 249
22161 添加 250
22162 删 251
2217 BTREE 252
2218 位图 254
23 加密算法 255
2311 AES 255
2312 RSA 255
2313 CRC 256
2314 MD5 256 13042018 Page 16 of 283
24 分布式缓存 257
2411 缓存雪崩 257
2412 缓存穿透 257
2413 缓存预热 257
2414 缓存更新 257
2415 缓存降级 257
25 HADOOP 259
2511 概念 259
2512 HDFS 259
25121 Client 259
25122 NameNode 259
25123 Secondary NameNode 259
25124 DataNode 259
2513 MapReduce 260
25131 Client 260
25132 JobTracker 260
25133 TaskTracker 261
25134 Task 261
25135 Reduce Task 执行程 261
2514 Hadoop MapReduce 作业生命周期 262
1作业提交初始化 262
2务调度监控 262
3务运行环境准备 262
4务执行 262
5作业完成 262
26 SPARK 263
2611 概念 263
2612 核心架构 263
Spark Core 263
Spark SQL 263
Spark Streaming 263
Mllib 263
GraphX 263
2613 核心组件 264
Cluster Manager制整集群监控 worker 264
Worker 节点负责控制计算节点 264
Driver: 运行 Application main()函数 264
Executor:执行器某 Application 运行 worker node 进程 264
2614 SPARK 编程模型 264
2615 SPARK 计算模型 265
2616 SPARK 运行流程 266
1 构建 Spark Application 运行环境启动 SparkContext 267
2 SparkContext 资源理器( StandaloneMesosYarn)申请运行 Executor 资源启
动 StandaloneExecutorbackend 267
3 Executor SparkContext 申请 Task 267
4 SparkContext 应程序分发 Executor 267
5 SparkContext 构建成 DAG 图 DAG 图分解成 Stage Taskset 发送 Task Scheduler
Task Scheduler Task 发送 Executor 运行 267
6 Task Executor 运行运行完释放资源 267
2617 SPARK RDD 流程 267
2618 SPARK RDD 267
(1)RDD 创建方式 267
(2)RDD 两种操作算子(转换(Transformation)行动(Action)) 268
27 STORM 269 13042018 Page 17 of 283
2711 概念 269
2711 集群架构 269
27111 Nimbus(master代码分发 Supervisor) 269
27112 Supervisor(slave理 Worker 进程启动终止) 269
27113 Worker(具体处理组件逻辑进程) 269
27114 Task 270
27115 ZooKeeper 270
2712 编程模型(spout>tuple>bolt) 270
27121 Topology 270
27122 Spout 270
27123 Bolt 270
27124 Tuple 270
27125 Stream 271
2713 Topology 运行 271
(1) Worker(进程) (2) Executor(线程) (3) Task 271
27131 Worker(1 worker 进程执行 1 topology 子集) 271
27132 Executor(executor 1 worker 进程启动单独线程) 271
27133 Task(终运行 spout bolt 中代码单元) 272
2714 Storm Streaming Grouping 272
27141 huffle Grouping 273
27142 Fields Grouping 273
27143 All grouping :广播 273
27144 Global grouping 274
27145 None grouping :分组 274
27146 Direct grouping :直接分组 指定分组 274
28 YARN 275
2811 概念 275
2812 ResourceManager 275
2813 NodeManager 275
2814 ApplicationMaster 276
2815 YARN 运行流程 277
29 机器学 278
2911 决策树 278
2912 机森林算法 278
2913 逻辑回 278
2914 SVM 278
2915 朴素贝叶斯 278
2916 K 邻算法 278
2917 K 均值算法 278
2918 Adaboost 算法 278
2919 神网络 278
29110 马尔夫 278
30 云计算 279
3011 SaaS 279
3012 PaaS 279
3013 IaaS 279
3014 Docker 279
30141 概念 279
30142 Namespaces 280
30143 进程(CLONE_NEWPID 实现进程隔离) 281
30144 Libnetwork 网络隔离 281
30145 资源隔离 CGroups 282
30146 镜 UnionFS 282
30147 存储驱动 282 13042018 Page 18 of 283
3015 Openstack 283
13042018 Page 19 of 283
2 JVM
(1) 基概念:
JVM 运行 Java 代码假想计算机 包括套字节码指令集组寄存器栈
垃圾回收堆 存储方法域JVM 运行操作系统硬件没直接
交互
(2) 运行程: 13042018 Page 20 of 283
知道 Java 源文件通编译器够生产相应Class 文件字节码文件
字节码文件通 Java 虚拟机中解释器编译成特定机器机器码
:
① Java 源文件—>编译器—>字节码文件
② 字节码文件—>JVM—>机器码
种台解释器实现虚拟机相 Java 什够
跨台原 程序开始运行时虚拟机开始实例化程序启动会
存虚拟机实例程序退出者关闭虚拟机实例消亡虚拟机实例间数
享
21 线程
里说线程指程序执行程中线程实体JVM 允许应发执行线程
Hotspot JVM 中 Java 线程原生操作系统线程直接映射关系线程存储缓
区分配步象栈程序计数器等准备会创建操作系统原生线程
Java 线程结束原生线程回收操作系统负责调度线程分配
CPU 原生线程初始化完毕会调 Java 线程 run() 方法线程结束时13042018 Page 21 of 283
会释放原生线程 Java 线程资源
Hotspot JVM 台运行系统线程面:
虚拟机线程
(VM thread)
线程等 JVM 达安全点操作出现操作必须独立线程里执行
堆修改法进行时线程需 JVM 位安全点操作类型:stopthe
world 垃圾回收线程栈 dump线程暂停线程偏锁(biased locking)解
周期性务线程 线程负责定时器事件(中断)调度周期性操作执行
GC 线程 线程支持 JVM 中垃圾回收活动
编译器线程 线程运行时字节码动态编译成台相关机器码
信号分发线程 线程接收发送 JVM 信号调适 JVM 方法处理
22 JVM 存区域
JVM 存区域分线程私区域程序计数器虚拟机栈方法区线程享区
域JAVA 堆方法区直接存
线程私数区域生命周期线程相 赖户线程启动结束 创建销毁( Hotspot
VM 线程操作系统线程直接映射 部分存区域存否线程
生死应) 13042018 Page 22 of 283
线程享区域虚拟机启动关闭创建销毁
直接存 JVM 运行时数区部分 会频繁 JDK 14 引入 NIO 提
供基 Channel Buffer IO 方式 Native 函数库直接分配堆外存 然
DirectByteBuffer 象作块存引进行操作(详见 Java IO 扩展) 样避免 Java
堆 Native 堆中回复制数 场景中显著提高性
221 程序计数器(线程私)
块较存空间 前线程执行字节码行号指示器条线程独立
程序计数器类存称线程私存
正执行 java 方法话计数器记录虚拟机字节码指令址(前指令址)
果 Native 方法空
存区域唯虚拟机中没规定 OutOfMemoryError 情况区域
222 虚拟机栈(线程私)
描述 java 方法执行存模型方法执行时会创建栈帧(Stack Frame)
存储局部变量表操作数栈动态链接方法出口等信息方法调直执行完成
程应着栈帧虚拟机栈中入栈出栈程
栈帧( Frame)存储数部分程结果数结构时处理动态链接
(Dynamic Linking) 方法返回值异常分派( Dispatch Exception)栈帧着方法调创13042018 Page 23 of 283
建着方法结束销毁——方法正常完成异常完成(抛出方法未捕获异
常)算作方法结束
223 方法区(线程私)
方法区 Java Stack 作类似 区虚拟机栈执行 Java 方法服务 方法栈
Native 方法服务 果 VM 实现 Clinkage 模型支持 Native 调 该栈会
C 栈 HotSpot VM 直接方法栈虚拟机栈合二
224 堆(Heap线程享)运行时数区
线程享块存区域创建象数组保存 Java 堆存中垃圾收集器进行
垃圾收集重存区域现代 VM 采分代收集算法 Java 堆 GC 角度
细分 新生代(Eden 区From Survivor 区 To Survivor 区)老年代
225 方法区永久代(线程享)
常说永久代(Permanent Generation) 存储 JVM 加载类信息常量静
态变量时编译器编译代码等数 HotSpot VMGC分代收集扩展方法区 Java
堆永久代实现方法区 样 HotSpot 垃圾收集器理 Java 堆样理部分存
必方法区开发专门存理器(永久带存回收目标针常量池回收类型
卸载 收益般)
运行时常量池(Runtime Constant Pool)方法区部分Class 文件中类版
字段方法接口等描述等信息外项信息常量池 13042018 Page 24 of 283
(Constant Pool Table)存放编译期生成种字面量符号引部分容类加
载存放方法区运行时常量池中 Java 虚拟机 Class 文件部分(然包括常量
池)格式严格规定字节存储种数必须符合规范求样会
虚拟机认装载执行
23 JVM 运行时存
Java 堆 GC 角度细分 新生代(Eden 区From Survivor 区 To Survivor 区)老年
代
231 新生代
存放新生象般占堆 13 空间频繁创建象新生代会频繁触发
MinorGC 进行垃圾回收新生代分 Eden 区ServivorFromServivorTo 三区
2311 Eden 区
Java 新象出生(果新创建象占存直接分配老
年代) Eden 区存够时候会触发 MinorGC新生代区进行
次垃圾回收
2312 ServivorFrom
次 GC 幸存者作次 GC 扫描者
2313 ServivorTo
保留次 MinorGC 程中幸存者
2314 MinorGC 程(复制>清空>互换)
MinorGC 采复制算法 13042018 Page 25 of 283
1:edenservicorFrom 复制 ServicorTo年龄+1
首先 Eden ServivorFrom 区域中存活象复制 ServicorTo 区域(果象年
龄达老年标准赋值老年代区)时象年龄+1(果 ServicorTo
够位置放老年区)
2:清空 edenservicorFrom
然清空 Eden ServicorFrom 中象
3:ServicorTo ServicorFrom 互换
ServicorTo ServicorFrom 互换原 ServicorTo 成次 GC 时 ServicorFrom
区
232 老年代
存放应程序中生命周期长存象
老年代象较稳定 MajorGC 会频繁执行进行 MajorGC 前般先进行
次 MinorGC新生代象晋身入老年代导致空间够时触发法找足
够连续空间分配新创建较象时会提前触发次 MajorGC 进行垃圾回收腾出空间
MajorGC 采标记清算法:首先扫描次老年代标记出存活象然回收没
标记象MajorGC 耗时较长扫描回收MajorGC 会产生存碎片减
少存损耗般需进行合者标记出方便次直接分配老年代满装
时候会抛出 OOM(Out of Memory)异常
233 永久代
指存永久保存区域存放 Class Meta(元数)信息Class 加载时候
放入永久区域存放实例区域GC 会程序运行期永久区域进行清理
导致永久代区域会着加载 Class 增胀满终抛出 OOM 异常
2331 JAVA8 元数
Java8 中永久代已移称元数区(元空间)区域取代元空间
质永久代类似元空间永久代间区:元空间虚拟机中
存默认情况元空间仅受存限制类元数放入 native
memory 字符串池类静态变量放入 java 堆中样加载少类元数
MaxPermSize 控制 系统实际空间控制
13042018 Page 26 of 283
24 垃圾回收算法
241 确定垃圾
2411 引计数法
Java 中引象关联果操作象必须引进行显然简单
办法通引计数判断象否回收简单说象果没关
联引引计数 0说明象太象回收
象
2412 达性分析
解决引计数法循环引问题Java 达性分析方法通系列GC roots
象作起点搜索果GC roots象间没达路径称该象达13042018 Page 27 of 283
注意达象等价回收象达象变回收象少两次标记
程两次标记然回收象面回收
242 标记清算法(MarkSweep)
基础垃圾回收算法分两阶段标注清标记阶段标记出需回收象清
阶段回收标记象占空间图
图中发现该算法问题存碎片化严重续发生象找
利空间问题
243 复制算法(copying)
解决 MarkSweep 算法存碎片化缺陷提出算法存容量存划分等
两块次中块块存满尚存活象复制块已
存清掉图: 13042018 Page 28 of 283
种算法然实现简单存效率高易产生碎片问题存压缩原
半存活象增话Copying 算法效率会降低
244 标记整理算法(MarkCompact)
结合两算法避免缺陷提出标记阶段 MarkSweep 算法相标记清
理象存活象移存端然清端边界外象图:
13042018 Page 29 of 283
245 分代收集算法
分代收集法目前部分 JVM 采方法核心思想根象存活生命周期存
划分域般情况 GC 堆划分老生代(TenuredOld Generation)新生代(Young
Generation)老生代特点次垃圾回收时少量象需回收新生代特点次垃
圾回收时量垃圾需回收根区域选择算法
2451 新生代复制算法
目前部分 JVM GC 新生代采取 Copying 算法新生代中次垃圾回收
回收部分象复制操作较少通常 1:1 划分新生代般新生代
划分块较 Eden 空间两较 Survivor 空间(From Space To Space)次
Eden 空间中块 Survivor 空间进行回收时该两块空间中存活象复制
块 Survivor 空间中
2452 老年代标记复制算法
老年代次回收少量象采 MarkCompact 算法
1 JAVA 虚拟机提处方法区永生代(Permanet Generation)存储 class 类
常量方法描述等永生代回收包括废弃常量类
2 象存分配新生代 Eden Space Survivor Space From Space(Survivor 目
前存放象块)少数情况会直接分配老生代
3 新生代 Eden Space From Space 空间足时会发生次 GC进行 GC Eden
Space From Space 区存活象会挪 To Space然 Eden Space From
Space 进行清理
4 果 To Space 法足够存储某象象存储老生代
5 进行 GC 便 Eden Space To Space 反复循环
6 象 Survivor 区躲次 GC 年龄会+1默认情况年龄达 15 象会
移老生代中 13042018 Page 30 of 283
25 JAVA 四中引类型
251 强引
Java 中常见强引象赋引变量引变量强引
象强引变量引时处达状态垃圾回收机制回收
该象永远会 JVM 会回收强引造成 Java 存泄漏原
252 软引
软引需 SoftReference 类实现软引象说系统存足够时
会回收系统存空间足时会回收软引通常存敏感程序中
253 弱引
弱引需 WeakReference 类实现软引生存期更短弱引象
说垃圾回收机制运行 JVM 存空间否足够总会回收该象占存
254 虚引
虚引需 PhantomReference 类实现单独必须引队列联合虚
引作踪象垃圾回收状态
26 GC 分代收集算法 VS 分区收集算法
261 分代收集算法
前流 VM 垃圾收集采分代收集(Generational Collection)算法 种算法会根
象存活周期存划分块 JVM 中 新生代老年代永久代样根
年代特点分采适 GC 算法
2611 新生代复制算法
次垃圾收集发现批象已死 少量存活 选复制算法 需付出少量
存活象复制成完成收集
2612 老年代标记整理算法
象存活率高没额外空间进行分配担保 必须采标记—清理标
记—整理算法进行回收 必进行存复制 直接腾出空闲存 13042018 Page 31 of 283
262 分区收集算法
分区算法整堆空间划分连续区间 区间独立 独立回收 样做
处控制次回收少区间 根目标停顿时间 次合理回收干区间(
整堆) 减少次 GC 产生停顿
27 GC 垃圾收集器
Java 堆存划分新生代年老代两部分新生代复制标记清垃圾回收算法
年老代标记整理垃圾回收算法 java 虚拟中针新生代年老代分提供种
垃圾收集器JDK16 中 Sun HotSpot 虚拟机垃圾收集器:
271 Serial 垃圾收集器(单线程复制算法)
Serial(英文连续)基垃圾收集器复制算法 JDK131 前新生代唯垃圾
收集器Serial 单线程收集器会 CPU 条线程完成垃圾收集工
作进行垃圾收集时必须暂停工作线程直垃圾收集结束
Serial 垃圾收集器然收集垃圾程中需暂停工作线程简单高效限
定单 CPU 环境说没线程交互开销获高单线程垃圾收集效率 Serial
垃圾收集器然 java 虚拟机运行 Client 模式默认新生代垃圾收集器
272 ParNew 垃圾收集器(Serial+线程)
ParNew 垃圾收集器实 Serial 收集器线程版复制算法线程进行垃
圾收集外余行 Serial 收集器完全样ParNew 垃圾收集器垃圾收集程中样
暂停工作线程 13042018 Page 32 of 283
ParNew 收集器默认开启 CPU 数目相线程数通XXParallelGCThreads 参数限
制垃圾收集器线程数Parallel:行
ParNew 然线程外 Serial 收集器完全样 ParNew 垃圾收集器 java
虚拟机运行 Server 模式新生代默认垃圾收集器
273 Parallel Scavenge 收集器(线程复制算法高效)
Parallel Scavenge 收集器新生代垃圾收集器样复制算法线程垃
圾收集器重点关注程序达控制吞吐量(ThoughputCPU 运行户代码
时间CPU 总消耗时间吞吐量运行户代码时间(运行户代码时间+垃圾收集时间))
高吞吐量高效率利 CPU 时间快完成程序运算务适台运算
需太交互务适应调节策略 ParallelScavenge 收集器 ParNew 收集器
重区
274 Serial Old 收集器(单线程标记整理算法 )
Serial Old Serial 垃圾收集器年老代版样单线程收集器标记整理算法
收集器运行 Client 默认 java 虚拟机默认年老代垃圾收集器
Server 模式两途:
1 JDK15 前版中新生代 Parallel Scavenge 收集器搭配
2 作年老代中 CMS 收集器备垃圾收集方案
新生代 Serial 年老代 Serial Old 搭配垃圾收集程图:
新生代 Parallel Scavenge 收集器 ParNew 收集器工作原理类似线程收集器
复制算法垃圾收集程中需暂停工作线程新生代 Parallel
ScavengeParNew 年老代 Serial Old 搭配垃圾收集程图:
13042018 Page 33 of 283
275 Parallel Old 收集器(线程标记整理算法)
Parallel Old 收集器 Parallel Scavenge 年老代版线程标记整理算法 JDK16
开始提供
JDK16 前新生代 ParallelScavenge 收集器搭配年老代 Serial Old 收集器
保证新生代吞吐量优先法保证整体吞吐量Parallel Old 正年老代样提供吞
吐量优先垃圾收集器果系统吞吐量求较高优先考虑新生代 Parallel Scavenge
年老代 Parallel Old 收集器搭配策略
新生代 Parallel Scavenge 年老代 Parallel Old 收集器搭配运行程图:
276 CMS 收集器(线程标记清算法)
Concurrent mark sweep(CMS)收集器种年老代垃圾收集器目标获取短垃圾
回收停顿时间年老代标记整理算法线程标记清算法
短垃圾收集停顿时间交互较高程序提高户体验
CMS 工作机制相垃圾收集器说更复杂整程分 4 阶段:
2761 初始标记
标记 GC Roots 直接关联象速度快然需暂停工作线程 13042018 Page 34 of 283
2762 发标记
进行 GC Roots 踪程户线程起工作需暂停工作线程
2763 重新标记
修正发标记期间户程序继续运行导致标记产生变动部分象标记
记录然需暂停工作线程
2764 发清
清 GC Roots 达象户线程起工作需暂停工作线程耗时长
发标记发清程中垃圾收集线程户现起发工作总体
CMS 收集器存回收户线程起发执行
CMS 收集器工作程:
277 G1 收集器
Garbage first 垃圾收集器目前垃圾收集器理发展前成果相 CMS 收集器G1 收
集器两突出改进:
1 基标记整理算法产生存碎片
2 非常精确控制停顿时间牺牲吞吐量前提实现低停顿垃圾回收
G1 收集器避免全区域垃圾收集堆存划分固定独立区域踪区域
垃圾收集进度时台维护优先级列表次根允许收集时间优先回收垃圾
区域区域划分优先级区域回收机制确保 G1 收集器限时间获高垃圾收
集效率
28 JAVA IONIO
281 阻塞 IO 模型
传统种 IO 模型读写数程中会发生阻塞现象户线程发出 IO 请求
核会查数否绪果没绪会等数绪户线程会处阻塞状态
户线程交出 CPU数绪核会数拷贝户线程返回结果户线程13042018 Page 35 of 283
户线程解 block 状态典型阻塞 IO 模型例子:data socketread()果数没
绪会直阻塞 read 方法
282 非阻塞 IO 模型
户线程发起 read 操作需等马结果果结果
error 时知道数没准备次发送 read 操作旦核中数准备
次收户线程请求马数拷贝户线程然返回
事实非阻塞 IO 模型中户线程需断询问核数否绪说非阻塞 IO
会交出 CPU会直占 CPU典型非阻塞 IO 模型般:
while(true){
data socketread()
if(data error){
处理数
break
}
}
非阻塞 IO 非常严重问题 while 循环中需断询问核数否
绪样会导致 CPU 占率非常高般情况少 while 循环种方式读取数
283 路复 IO 模型
路复 IO 模型目前较模型Java NIO 实际路复 IO路复 IO
模型中会线程断轮询 socket 状态 socket 真正读写事件时真
正调实际 IO 读写操作路复 IO 模型中需线程理
socket系统需建立新进程者线程必维护线程进程真正
socket 读写事件进行时会 IO 资源减少资源占 Java NIO 中通
selectorselect()查询通道否达事件果没事件直阻塞里
种方式会导致户线程阻塞路复 IO 模式通线程理 socket
socket 真正读写事件发生会占资源进行实际读写操作路复 IO 较适合连
接数较情况
外路复 IO 非阻塞 IO 模型效率高非阻塞 IO 中断询问 socket 状态
时通户线程进行路复 IO 中轮询 socket 状态核进行效
率户线程高
注意路复 IO 模型通轮询方式检测否事件达达事件
逐进行响应路复 IO 模型说旦事件响应体会导致续事件
迟迟处理会影响新事件轮询 13042018 Page 36 of 283
284 信号驱动 IO 模型
信号驱动 IO 模型中户线程发起 IO 请求操作会应 socket 注册信号函
数然户线程会继续执行核数绪时会发送信号户线程户线程接收
信号便信号函数中调 IO 读写操作进行实际 IO 请求操作
285 异步 IO 模型
异步 IO 模型理想 IO 模型异步 IO 模型中户线程发起 read 操作立刻
开始做事方面核角度受 asynchronous read
会立刻返回说明 read 请求已成功发起会户线程产生 block然
核会等数准备完成然数拷贝户线程切完成核会户线程
发送信号告诉 read 操作完成说户线程完全需实际整 IO 操作
进行需先发起请求接收核返回成功信号时表示 IO 操作已完成直接
数
说异步 IO 模型中IO 操作两阶段会阻塞户线程两阶段核动完
成然发送信号告知户线程操作已完成户线程中需次调 IO 函数进行具体
读写点信号驱动模型信号驱动模型中户线程接收信号表示数
已绪然需户线程调 IO 函数进行实际读写操作异步 IO 模型中收信号
表示 IO 操作已完成需户线程中调 IO 函数进行实际读写操作
注意异步 IO 需操作系统底层支持 Java 7 中提供 Asynchronous IO
更参考: httpwwwimportnewcom19816html
281 JAVA IO 包
13042018 Page 37 of 283
282 JAVA NIO
NIO 三核心部分:Channel(通道)Buffer(缓区) Selector传统 IO 基字节流字
符流进行操作 NIO 基 Channel Buffer(缓区)进行操作数总通道读取缓区
中者缓区写入通道中Selector(选择区)监听通道事件(:连接开
数达)单线程监听数通道 13042018 Page 38 of 283
NIO 传统 IO 间第区IO 面流NIO 面缓区
2821 NIO 缓区
Java IO 面流意味着次流中读字节直读取字节没缓存
方外前移动流中数果需前移动流中读取数需先缓
存缓区NIO 缓导方法数读取稍处理缓区需时
缓区中前移动增加处理程中灵活性需检查否该缓区中包含
您需处理数需确保更数读入缓区时覆盖缓区里尚未处理
数
2822 NIO 非阻塞
IO 种流阻塞意味着线程调 read() write()时该线程阻塞直
数读取数完全写入该线程期间干事情 NIO 非阻塞模式
线程某通道发送请求读取数仅目前数果目前没数
时什会获取保持线程阻塞直数变读取前该线程
继续做事情 非阻塞写线程请求写入数某通道需等
完全写入线程时做事情 线程通常非阻塞 IO 空闲时间通道
执行 IO 操作单独线程现理输入输出通道(channel)
13042018 Page 39 of 283
13042018 Page 40 of 283
283 Channel
首先说 Channel国翻译成通道Channel IO 中 Stream(流)差
等级 Stream 单譬:InputStream OutputStream Channel 双
进行读操作进行写操作
NIO 中 Channel 实现:
1 FileChannel
2 DatagramChannel
3 SocketChannel
4 ServerSocketChannel
里名字猜出然:分应文件 IOUDP TCP(Server Client)
面演示案例基围绕 4 类型 Channel 进行陈述
284 Buffer
Buffer名思意缓区实际容器连续数组Channel 提供文件
网络读取数渠道读取写入数必须 Buffer
面图描述客户端服务端发送数然服务端接收数程客户端发送
数时必须先数存入 Buffer 中然 Buffer 中容写入通道服务端边接收数必
须通 Channel 数读入 Buffer 中然 Buffer 中取出数处理
NIO 中Buffer 顶层父类抽象类常 Buffer 子类:
ByteBufferIntBuffer CharBuffer LongBuffer DoubleBufferFloatBuffer
ShortBuffer
285 Selector
Selector 类 NIO 核心类Selector 够检测注册通道否事件发生果事
件发生便获取事件然针事件进行相应响应处理样单线程
理通道理连接样连接真正读写事件发生时会调
函数进行读写减少系统开销必连接创建线程维护
线程避免线程间文切换导致开销 13042018 Page 41 of 283
29 JVM 类加载机制
JVM 类加载机制分五部分:加载验证准备解析初始化面分
五程
2911 加载
加载类加载程中阶段阶段会存中生成代表类 javalangClass
象作方法区类种数入口注意里定非 Class 文件获取里
ZIP 包中读取( jar 包 war 包中读取)运行时计算生成(动态代理)
文件生成( JSP 文件转换成应 Class 类)
2912 验证
阶段目确保 Class 文件字节流中包含信息否符合前虚拟机求
会危害虚拟机身安全
2913 准备
准备阶段正式类变量分配存设置类变量初始值阶段方法区中分配变量
存空间注意里说初始值概念类变量定义:
public static int v 8080
实际变量 v 准备阶段初始值 0 8080 v 赋值 8080 put static 指令
程序编译存放类构造器
注意果声明:
public static final int v 8080
编译阶段会 v 生成 ConstantValue 属性准备阶段虚拟机会根 ConstantValue 属性 v
赋值 8080
2914 解析
解析阶段指虚拟机常量池中符号引换直接引程符号引 class 文件中
: 13042018 Page 42 of 283
1 CONSTANT_Class_info
2 CONSTANT_Field_info
3 CONSTANT_Method_info
等类型常量
2915 符号引
符号引虚拟机实现布局关引目标定已加载存中种虚拟
机实现存布局相接受符号引必须致符号引
字面量形式明确定义 Java 虚拟机规范 Class 文件格式中
2916 直接引
直接引指目标指针相偏移量间接定位目标句柄果
直接引引目标必定已存中存
2917 初始化
初始化阶段类加载阶段前面类加载阶段加载阶段定义类加载
器外操作 JVM 导初始阶段开始真正执行类中定义 Java 程序代码
2918 类构造器
初始化阶段执行类构造器
量赋值操作静态语句块中语句合成虚拟机会保证子
器类生成
注意种情况会执行类初始化:
1 通子类引父类静态字段会触发父类初始化会触发子类初始化
2 定义象数组会触发该类初始化
3 常量编译期间会存入调类常量池中质没直接引定义常量类会触
发定义常量类
4 通类名获取 Class 象会触发类初始化
5 通 ClassforName 加载指定类时果指定参数 initialize false 时会触发类初
始化实参数告诉虚拟机否类进行初始化
6 通 ClassLoader 默认 loadClass 方法会触发初始化动作
292 类加载器
虚拟机设计团队加载动作放 JVM 外部实现便应程序决定获取需类JVM 提
供 3 种类加载器: 13042018 Page 43 of 283
2921 启动类加载器(Bootstrap ClassLoader)
1 负责加载 JAVA_HOME\lib 目录中通Xbootclasspath 参数指定路径中
虚拟机认(文件名识 rtjar)类
2922 扩展类加载器(Extension ClassLoader)
2 负责加载 JAVA_HOME\lib\ext 目录中通 javaextdirs 系统变量指定路径中类
库
2923 应程序类加载器(Application ClassLoader):
3 负责加载户路径(classpath)类库
JVM 通双亲委派模型进行类加载然通继承 javalangClassLoader
实现定义类加载器
293 双亲委派
类收类加载请求首先会尝试加载类请求委派父
类完成层次类加载器加载请求应该传送启动类加载中
父类加载器反馈法完成请求时候(加载路径没找需加载
Class)子类加载器会尝试加载
采双亲委派处加载位 rtjar 包中类 javalangObject加载
器加载类终委托顶层启动类加载器进行加载样保证类加载
器终样 Object 象 13042018 Page 44 of 283
294 OSGI(动态模型系统)
OSGi(Open Service Gateway Initiative)面 Java 动态模型系统 Java 动态化模块化系
统系列规范
2941 动态改变构造
OSGi 服务台提供种网络设备需重启动态改变构造功化耦合度促
耦合度理OSGi 技术提供种面服务架构组件动态发现方
2942 模块化编程热插拔
OSGi 旨实现 Java 程序模块化编程提供基础条件基 OSGi 程序实现模块级
热插拔功程序升级更新时停重新安装然启动程序中部分企
业级程序开发说非常具诱惑力特性
OSGi 描绘美模块化开发目标定义实现目标需服务架构时
成熟框架进行实现支持非应适合采 OSGi 作基础架构提供强
功时引入额外复杂度遵守类加载双亲委托模型 13042018 Page 45 of 283
3 JAVA 集合
31 接口继承关系实现
集合类存放 Javautil 包中 3 种:set(集)list(列表包含 Queue) map(映射)
1 Collection:Collection 集合 ListSetQueue 基接口
2 Iterator:迭代器通迭代器遍历集合中数
3 Map:映射表基础接口
13042018 Page 46 of 283
13042018 Page 47 of 283
32 List
Java List 非常常数类型List 序 CollectionJava List 三实现类:
分 ArrayListVector LinkedList
321 ArrayList(数组)
ArrayList 常 List 实现类部通数组实现允许元素进行快速机访问数
组缺点元素间间隔数组满足时需增加存储力已数
组数复制新存储空间中 ArrayList 中间位置插入者删元素时需数组进
行复制移动代价较高适合机查找遍历适合插入删
322 Vector(数组实现线程步)
Vector ArrayList 样通数组实现支持线程步某时刻
线程够写 Vector避免线程时写引起致性实现步需高花费
访问访问 ArrayList 慢
323 LinkList(链表)
LinkedList 链表结构存储数适合数动态插入删机访问遍历速度较
慢外提供 List 接口中没定义方法专门操作表头表尾元素作堆
栈队列双队列 13042018 Page 48 of 283
33 Set
Set 注重独二性质该体系集合存储序(存入取出序定相)元素值重
复象相等性质象 hashCode 值(java 象存址计算出序号)判断
果想两象视相等必须覆盖 Object hashCode 方法 equals 方
法
3311 HashSet(Hash 表)
哈希表边存放哈希值HashSet 存储元素序存入时序( List 显然
) 哈希值存取数哈希值取元素哈希值通元素
hashcode 方法获取 HashSet 首先判断两元素哈希值果哈希值样接着会较
equals 方法 果 equls 结果 true HashSet 视元素果 equals false
元素
哈希值相 equals false 元素存储呢样哈希值延(认哈希值相
元素放哈希桶中)哈希样存列图 1 表示 hashCode 值相情
况图 2 表示 hashCode 值相 equals 相情况
13042018 Page 49 of 283
HashSet 通 hashCode 值确定元素存中位置 hashCode 位置存放元
素
3312 TreeSet(二叉树)
1 TreeSet()二叉树原理新 add()象指定序排序(升序降序)增
加象会进行排序象插入二叉树指定位置
2 Integer String 象进行默认 TreeSet 排序定义类象
定义类必须实现 Comparable 接口覆写相应 compareTo()函数正常
3 覆写 compare()函数时返回相应值 TreeSet 定规排序
4 较象指定象序果该象等指定象分返回负整
数零正整数
3313 LinkHashSet(HashSet+LinkedHashMap)
LinkedHashSet 言继承 HashSet 基 LinkedHashMap 实现
LinkedHashSet 底层 LinkedHashMap 保存元素继承 HashSet方法
操作 HashSet 相 LinkedHashSet 实现非常简单提供四构造方法
通传递标识参数调父类构造器底层构造 LinkedHashMap 实现相关操
作父类 HashSet 操作相直接调父类 HashSet 方法 13042018 Page 50 of 283
34 Map
341 HashMap(数组+链表+红黑树)
HashMap 根键 hashCode 值存储数数情况直接定位值具快
访问速度遍历序确定 HashMap 允许条记录键 null允许条记
录值 nullHashMap 非线程安全时刻线程时写 HashMap会导
致数致果需满足线程安全 Collections synchronizedMap 方法
HashMap 具线程安全力者 ConcurrentHashMap面张图介绍
HashMap 结构
3411 JAVA7 实现
方HashMap 里面数组然数组中元素单链表图中绿色
实体嵌套类 Entry 实例Entry 包含四属性:key value hash 值单链表 next
1 capacity:前数组容量始终保持 2^n扩容扩容数组前 2 倍
2 loadFactor:负载子默认 075 13042018 Page 51 of 283
3 threshold:扩容阈值等 capacity * loadFactor
3412 JAVA8 实现
Java8 HashMap 进行修改利红黑树 数组+链表+红黑
树 组成
根 Java7 HashMap 介绍知道查找时候根 hash 值够快速定位数组
具体标话需着链表较找需时间复杂度取决
链表长度 O(n)降低部分开销 Java8 中链表中元素超 8
会链表转换红黑树位置进行查找时候降低时间复杂度 O(logN)
342 ConcurrentHashMap
3421 Segment 段
ConcurrentHashMap HashMap 思路差支持发操作复杂
整 ConcurrentHashMap Segment 组成Segment 代表部分段
意思方会描述分段锁注意行文中方槽代表
segment
3422 线程安全(Segment 继承 ReentrantLock 加锁)
简单理解ConcurrentHashMap Segment 数组Segment 通继承
ReentrantLock 进行加锁次需加锁操作锁住 segment样保证
Segment 线程安全实现全局线程安全 13042018 Page 52 of 283
3423 行度(默认 16)
concurrencyLevel:行级发数Segment 数翻译重理解默认 16
说 ConcurrentHashMap 16 Segments理时候时支
持 16 线程发写操作分分布 Segment 值初始化时
候设置值旦初始化扩容具体 Segment 部实
Segment 前介绍 HashMap保证线程安全处理起麻烦
3424 Java8 实现 (引入红黑树)
Java8 ConcurrentHashMap 进行较改动Java8 引入红黑树
13042018 Page 53 of 283
343 HashTable(线程安全)
Hashtable 遗留类映射常功 HashMap 类似承 Dictionary 类
线程安全时间线程写 Hashtable发性 ConcurrentHashMap
ConcurrentHashMap 引入分段锁Hashtable 建议新代码中需线程安全
场合 HashMap 换需线程安全场合 ConcurrentHashMap 换
344 TreeMap(排序)
TreeMap 实现 SortedMap 接口够保存记录根键排序默认键值升序排序
指定排序较器 Iterator 遍历 TreeMap 时记录排序
果排序映射建议 TreeMap
TreeMap 时key 必须实现 Comparable 接口者构造 TreeMap 传入定义
Comparator否会运行时抛出 javalangClassCastException 类型异常
参考:httpswwwibmcomdeveloperworkscnjavajlotreeindexhtml
345 LinkHashMap(记录插入序)
LinkedHashMap HashMap 子类保存记录插入序 Iterator 遍历
LinkedHashMap 时先记录肯定先插入构造时带参数访问次序排序
参考 1:httpwwwimportnewcom28263html
参考 2:httpwwwimportnewcom20386html#comment648123
13042018 Page 54 of 283
4 JAVA 线程发
411 JAVA 发知识库
412 JAVA 线程实现创建方式
4121 继承 Thread 类
Thread 类质实现 Runnable 接口实例代表线程实例启动线程唯方
法通 Thread 类 start()实例方法start()方法 native 方法启动新线
程执行 run()方法
public class MyThread extends Thread {
public void run() {
Systemoutprintln(MyThreadrun())
}
}
MyThread myThread1 new MyThread()
myThread1start()
4122 实现 Runnable 接口
果类已 extends 类法直接 extends Thread时实现
Runnable 接口
public class MyThread extends OtherClass implements Runnable {
public void run() {
Systemoutprintln(MyThreadrun())
}
} 13042018 Page 55 of 283
启动 MyThread需首先实例化 Thread传入 MyThread 实例:
MyThread myThread new MyThread()
Thread thread new Thread(myThread)
threadstart()
事实传入 Runnable target 参数 Thread Thread run()方法会调
targetrun()
public void run() {
if (target null) {
targetrun()
}
}
4123 ExecutorServiceCallable
返回值务必须实现 Callable 接口类似返回值务必须 Runnable 接口执行
Callable 务获取 Future 象该象调 get 获取 Callable 务
返回 Object 结合线程池接口 ExecutorService 实现传说中返回结果线程
创建线程池
ExecutorService pool ExecutorsnewFixedThreadPool(taskSize)
创建返回值务
List
for (int i 0 i < taskSize i++) {
Callable c new MyCallable(i + )
执行务获取 Future 象
Future f poolsubmit(c)
listadd(f)
}
关闭线程池
poolshutdown()
获取发务运行结果
for (Future f list) {
Future 象获取务返回值输出控制台
Systemoutprintln(res: + fget()toString())
}
13042018 Page 56 of 283
4124 基线程池方式
线程数库连接资源非常宝贵资源次需时候创建需时候销
毁非常浪费资源缓存策略线程池
创建线程池
ExecutorService threadPool ExecutorsnewFixedThreadPool(10)
while(true) {
threadPoolexecute(new Runnable() { 提交线程务执行
@Override
public void run() {
Systemoutprintln(ThreadcurrentThread()getName() + is running )
try {
Threadsleep(3000)
} catch (InterruptedException e) {
eprintStackTrace()
}
}
})
}
}
413 4 种线程池
Java 里面线程池顶级接口 Executor严格意义讲 Executor 线程池
执行线程工具真正线程池接口 ExecutorService 13042018 Page 57 of 283
4131 newCachedThreadPool
创建根需创建新线程线程池前构造线程时重执行
短期异步务程序言线程池通常提高程序性调 execute 重前构造
线程(果线程)果现线程没创建新线程添加池中终止
缓存中移已 60 秒钟未线程长时间保持空闲线程池会资
源
4132 newFixedThreadPool
创建重固定线程数线程池享界队列方式运行线程意点
数 nThreads 线程会处处理务活动状态果线程处活动状态时提交附加务
线程前附加务队列中等果关闭前执行期间失败导致
线程终止新线程代执行续务(果需)某线程显式关闭
前池中线程直存 13042018 Page 58 of 283
4133 newScheduledThreadPool
创建线程池安排定延迟运行命令者定期执行
ScheduledExecutorService scheduledThreadPool ExecutorsnewScheduledThreadPool(3)
scheduledThreadPoolschedule(newRunnable(){
@Override
public void run() {
Systemoutprintln(延迟三秒)
}
} 3 TimeUnitSECONDS)
scheduledThreadPoolscheduleAtFixedRate(newRunnable(){
@Override
public void run() {
Systemoutprintln(延迟 1 秒三秒执行次)
}
}13TimeUnitSECONDS)
4134 newSingleThreadExecutor
ExecutorsnewSingleThreadExecutor()返回线程池(线程池线程)线程
池线程死(发生异常时)重新启动线程代原线程继续执行
414 线程生命周期(状态)
线程创建启动启动进入执行状态直处执行状态
线程生命周期中新建(New)绪(Runnable)运行(Running)阻塞
(Blocked)死亡(Dead)5 种状态尤线程启动直霸占着 CPU 独
运行 CPU 需条线程间切换线程状态会次运行阻塞间切换
4141 新建状态(NEW)
程序 new 关键字创建线程该线程处新建状态时仅 JVM 分配
存初始化成员变量值 13042018 Page 59 of 283
4142 绪状态(RUNNABLE):
线程象调 start()方法该线程处绪状态Java 虚拟机会创建方法调栈
程序计数器等调度运行
4143 运行状态(RUNNING):
果处绪状态线程获 CPU开始执行 run()方法线程执行体该线程处运行状
态
4144 阻塞状态(BLOCKED):
阻塞状态指线程某种原放弃 cpu 权出 cpu timeslice暂时停止运行
直线程进入运行(runnable)状态机会次获 cpu timeslice 转运行(running)状
态阻塞情况分三种:
等阻塞(owait>等列):
运行(running)线程执行 owait()方法JVM 会该线程放入等队列(waitting queue)
中
步阻塞(lock>锁池)
运行(running)线程获取象步锁时该步锁线程占 JVM 会该线
程放入锁池(lock pool)中
阻塞(sleepjoin)
运行(running)线程执行 Threadsleep(long ms) tjoin()方法者发出 IO 请求时
JVM 会该线程置阻塞状态 sleep()状态超时join()等线程终止者超时者 IO
处理完毕时线程重新转入运行(runnable)状态
4145 线程死亡(DEAD)
线程会面三种方式结束结束死亡状态
正常结束
1 run() call()方法执行完成线程正常结束
异常结束
2 线程抛出未捕获 Exception Error
调 stop
3 直接调该线程 stop()方法结束该线程—该方法通常容易导致死锁推荐
13042018 Page 60 of 283
415 终止线程 4 种方式
4151 正常运行结束
程序运行结束线程动结束
4152 退出标志退出线程
般 run()方法执行完线程会正常结束然常常线程伺服线程需长时间
运行外部某条件满足情况关闭线程变量控制循环例:
直接方法设 boolean 类型标志通设置标志 true false 控制 while
循环否退出代码示例:
public class ThreadSafe extends Thread {
public volatile boolean exit false
public void run() {
while (exit){
do something
}
}
}
定义退出标志 exit exit true 时while 循环退出exit 默认值 false定义 exit
时 Java 关键字 volatile关键字目 exit 步说时刻
线程修改 exit 值
4153 Interrupt 方法结束线程
interrupt()方法中断线程两种情况: 13042018 Page 61 of 283
1 线程处阻塞状态: sleep步锁 waitsocket 中 receiveraccept 等方法时
会线程处阻塞状态调线程 interrupt()方法时会抛出 InterruptException 异常
阻塞中方法抛出异常通代码捕获该异常然 break 跳出循环状态
机会结束线程执行通常认调 interrupt 方法线程会结束实
际错 定先捕获 InterruptedException 异常通 break 跳出循环正
常结束 run 方法
2 线程未处阻塞状态: isInterrupted()判断线程中断标志退出循环
interrupt()方法时中断标志会置 true定义标志控制循环样道理
public class ThreadSafe extends Thread {
public void run() {
while (isInterrupted()){ 非阻塞程中通判断中断标志退出
try{
Threadsleep(5*1000)阻塞程捕获中断异常退出
}catch(InterruptedException e){
eprintStackTrace()
break捕获异常执行 break 跳出循环
}
}
}
}
4154 stop 方法终止线程(线程安全)
程序中直接 threadstop()强行终止线程 stop 方法危险象突然关
闭计算机电源正常程序关机样会产生预料结果安全:
threadstop()调创建子线程线程会抛出 ThreadDeatherror 错误会释放子
线程持锁般进行加锁代码块保护数致性果调
threadstop()导致该线程持锁突然释放(控制)保护数呈
现致性线程破坏数时导致奇怪应程序错误
推荐 stop 方法终止线程
416 sleep wait 区
1 sleep()方法首先知道该方法属 Thread 类中 wait()方法属
Object 类中 13042018 Page 62 of 283
2 sleep()方法导致程序暂停执行指定时间出 cpu 该线程监控状态然
保持者指定时间会动恢复运行状态
3 调 sleep()方法程中线程会释放象锁
4 调 wait()方法时候线程会放弃象锁进入等象等锁定池针
象调 notify()方法线程进入象锁定池准备获取象锁进入运行状态
417 start run 区
1 start()方法启动线程真正实现线程运行时需等 run 方法体代码执行完毕
直接继续执行面代码
2 通调 Thread 类 start()方法启动线程 时线程处绪状态 没运
行
3 方法 run()称线程体包含执行线程容线程进入运行状态开始运
行 run 函数中代码 Run 方法运行结束 线程终止然 CPU 调度线程
418 JAVA 台线程
1 定义:守护线程称服务线程台线程特性户线程 提供 公
服务没户线程服务时会动离开
2 优先级:守护线程优先级较低系统中象线程提供服务
3 设置:通 setDaemon(true)设置线程守护线程户线程设置守护线程
方式 线程象创建 前 线程象 setDaemon 方法
4 Daemon 线程中产生新线程 Daemon
5 线程 JVM 级 Tomcat 例果 Web 应中启动线程线程
生命周期会 Web 应程序保持步说停止 Web 应线程
旧活跃
6 example 垃圾回收线程典守护线程程序中运行 Thread
程序会产生垃圾垃圾回收器事做垃圾回收线程 JVM 仅剩线
程时垃圾回收线程会动离开始终低级状态中运行实时监控理系统
中回收资源
7 生命周期:守护进程(Daemon)运行台种特殊进程独立控制终端周
期性执行某种务等处理某发生事件说守护线程赖终端
赖系统系统生死 JVM 中线程守护线程时候JVM 退
出果非守护线程 JVM 会退出
13042018 Page 63 of 283
419 JAVA 锁
4191 乐观锁
乐观锁种乐观思想认读写少遇发写性低次数时候认
会修改会锁更新时候会判断期间没更新数
采取写时先读出前版号然加锁操作(较次版号果样更新)
果失败重复读较写操作
java 中乐观锁基通 CAS 操作实现CAS 种更新原子操作较前值传入
值否样样更新否失败
4192 悲观锁
悲观锁悲观思想认写遇发写性高次数时候认
会修改次读写数时候会锁样想读写数会 block 直锁
java中悲观锁 SynchronizedAQS 框架锁先尝试 cas 乐观锁获取锁获取
会转换悲观锁 RetreenLock
4193 旋锁
旋锁原理非常简单果持锁线程短时间释放锁资源等竞争锁
线程需做核态户态间切换进入阻塞挂起状态需等等(旋)
等持锁线程释放锁立获取锁样避免户线程核切换消耗
线程旋需消耗 cup 说白 cup 做功果直获取锁线程
直占 cup 旋做功需设定旋等时间
果持锁线程执行时间超旋等时间扔没释放锁会导致争锁
线程等时间获取锁时争线程会停止旋进入阻塞状态
旋锁优缺点
旋锁减少线程阻塞锁竞争激烈占锁时间非常短代码块
说性幅度提升旋消耗会线程阻塞挂起唤醒操作消耗操作会
导致线程发生两次文切换
果锁竞争激烈者持锁线程需长时间占锁执行步块时候适合
旋锁旋锁获取锁前直占 cpu 做功占着 XX XX时量
线程竞争锁会导致获取锁时间长线程旋消耗线程阻塞挂起操作消耗
需 cup 线程获取 cpu造成 cpu 浪费种情况关闭旋锁
旋锁时间阈值(16 引入适应性旋锁)
旋锁目占着 CPU 资源释放等获取锁立进行处理选择
旋执行时间呢?果旋执行时间太长会量线程处旋状态占 CPU 资源进
会影响整体系统性旋周期选额外重 13042018 Page 64 of 283
JVM 旋周期选择jdk15 限度定写死 16 引入适应性旋锁适应
性旋锁意味着旋时间固定前次锁旋时间锁拥
者状态决定基认线程文切换时间佳时间时 JVM 针
前 CPU 负荷情况做较优化果均负载 CPUs 直旋果超(CPUs2)
线程正旋线程直接阻塞果正旋线程发现 Owner 发生变化延迟旋
时间(旋计数)进入阻塞果 CPU 处节电模式停止旋旋时间坏情况 CPU
存储延迟(CPU A 存储数 CPU B 知数直接时间差)旋时会适放
弃线程优先级间差异
旋锁开启
JDK16 中XX+UseSpinning 开启
XXPreBlockSpin10 旋次数
JDK17 掉参数 jvm 控制
4194 Synchronized 步锁
synchronized 意非 NULL 象作锁属独占式悲观锁时属重
入锁
Synchronized 作范围
1 作方法时锁住象实例(this)
2 作静态方法时锁住Class 实例Class 相关数存储永久带PermGen
(jdk18 metaspace)永久带全局享静态方法锁相类全局锁
会锁调该方法线程
3 synchronized 作象实例时锁住该象锁代码块队列
线程起访问某象监视器时候象监视器会线程存储容器中
Synchronized 核心组件
1) Wait Set:调 wait 方法阻塞线程放置里
2) Contention List:竞争队列请求锁线程首先放竞争队列中
3) Entry List:Contention List 中资格成候选资源线程移动 Entry List 中
4) OnDeck:意时刻线程正竞争锁资源该线程成 OnDeck
5) Owner:前已获取资源线程称 Owner
6) Owner:前释放锁线程
Synchronized 实现
13042018 Page 65 of 283
1 JVM 次队列尾部取出数锁竞争候选者(OnDeck)发情况
ContentionList 会量发线程进行 CAS 访问降低尾部元素竞争JVM 会
部分线程移动 EntryList 中作候选竞争线程
2 Owner 线程会 unlock 时 ContentionList 中部分线程迁移 EntryList 中指定
EntryList 中某线程 OnDeck 线程(般先进线程)
3 Owner 线程直接锁传递 OnDeck 线程锁竞争权利交 OnDeck
OnDeck 需重新竞争锁样然牺牲公性极提升系统吞吐量
JVM 中种选择行称竞争切换
4 OnDeck 线程获取锁资源会变 Owner 线程没锁资源然停留 EntryList
中果 Owner 线程 wait 方法阻塞转移 WaitSet 队列中直某时刻通 notify
者 notifyAll 唤醒会重新进 EntryList 中
5 处 ContentionListEntryListWaitSet 中线程处阻塞状态该阻塞操作系统
完成(Linux 核采 pthread_mutex_lock 核函数实现)
6 Synchronized 非公锁 Synchronized 线程进入 ContentionList 时等线程会先
尝试旋获取锁果获取进入 ContentionList明显已进入队列线程
公公事情旋获取锁线程直接抢占 OnDeck 线程锁
资源
参考:httpsblogcsdnnetzqz_zqzarticledetails70233767
7 象 monitor 象加锁竞争 monitor 象代码块加锁前分加
monitorenter monitorexit 指令实现方法加锁通标记位判断
8 synchronized 重量级操作需调操作系统相关接口性低效线
程加锁消耗时间操作消耗时间更
9 Java16synchronized 进行优化适应旋锁消锁粗化轻量级锁偏
锁等效率质提高推出 Java17 18 中均该关键字实现机理做
优化引入偏锁轻量级锁象头中标记位需操作系统加锁
10 锁偏锁升级轻量级锁升级重量级锁种升级程做锁膨胀
11 JDK 16 中默认开启偏锁轻量级锁通XXUseBiasedLocking 禁偏锁
13042018 Page 66 of 283
4195 ReentrantLock
ReentantLock 继承接口 Lock 实现接口中定义方法种重入锁完
成 synchronized 完成工作外提供诸响应中断锁轮询锁请求定时锁等
避免线程死锁方法
Lock 接口方法
1 void lock() 执行方法时 果锁处空闲状态 前线程获取锁 相反 果锁已
线程持 禁前线程 直前线程获取锁
2 boolean tryLock():果锁 获取锁 立返回 true 否返回 false 该方法
lock()区 tryLock()试图获取锁 果锁 会导致前线程禁
前线程然继续执行代码 lock()方法定获取锁 果锁
直等 未获锁前前线程继续执行
3 void unlock():执行方法时 前线程释放持锁 锁持者释放 果线程
持锁 执行该方法 导致异常发生
4 Condition newCondition():条件象获取等通知组件该组件前锁绑定
前线程获取锁调该组件 await()方法调前线程缩放锁
5 getHoldCount() :查询前线程保持锁次数执行线程执行 lock 方法次
数
6 getQueueLength():返回正等获取锁线程估计数启动 10 线程1
线程获锁时返回 9
7 getWaitQueueLength:(Condition condition)返回等锁相关定条件线
程估计数 10 线程 condition 象时 10 线程执行
condition 象 await 方法时执行方法返回 10
8 hasWaiters(Condition condition) : 查询否线程等锁关定条件
(condition)指定 contidion 象少线程执行 conditionawait 方法
9 hasQueuedThread(Thread thread):查询定线程否等获取锁
10 hasQueuedThreads():否线程等锁
11 isFair():该锁否公锁
12 isHeldByCurrentThread(): 前线程否保持锁锁定线程执行 lock 方法前分
false true
13 isLock():锁否意线程占
14 lockInterruptibly():果前线程未中断获取锁
15 tryLock():尝试获锁仅调时锁未线程占获锁
16 tryLock(long timeout TimeUnit unit):果锁定等时间没线程保持
获取该锁
非公锁
JVM 机原分配锁机制称公锁ReentrantLock 构造函数中提供
否公锁初始化方式默认非公锁非公锁实际执行效率远远超出公锁非
程序特殊需否常非公锁分配机制 13042018 Page 67 of 283
公锁
公锁指锁分配机制公通常先锁提出获取请求线程会先分配锁
ReentrantLock 构造函数中提供否公锁初始化方式定义公锁
ReentrantLock synchronized
1 ReentrantLock 通方法 lock() unlock()进行加锁解锁操作 synchronized 会
JVM 动解锁机制ReentrantLock 加锁需手动进行解锁避免程序出
现异常法正常解锁情况 ReentrantLock 必须 finally 控制块中进行解锁操
作
2 ReentrantLock 相 synchronized 优势中断公锁锁种情况需
ReentrantLock
ReentrantLock 实现
public class MyService {
private Lock lock new ReentrantLock()
Lock locknew ReentrantLock(true)公锁
Lock locknew ReentrantLock(false)非公锁
private Condition conditionlocknewCondition()创建 Condition
public void testMethod() {
try {
locklock()lock 加锁
1:wait 方法等:
Systemoutprintln(开始 wait)
conditionawait()
通创建 Condition 象线程 wait必须先执行 locklock 方法获锁
2:signal 方法唤醒
conditionsignal()condition 象 signal 方法唤醒 wait 线程
for (int i 0 i < 5 i++) {
Systemoutprintln(ThreadName + ThreadcurrentThread()getName()+ ( + (i + 1)))
}
} catch (InterruptedException e) {
eprintStackTrace()
}
finally 13042018 Page 68 of 283
{
lockunlock()
}
}
}
Condition 类 Object 类锁方法区区
1 Condition 类 awiat 方法 Object 类 wait 方法等效
2 Condition 类 signal 方法 Object 类 notify 方法等效
3 Condition 类 signalAll 方法 Object 类 notifyAll 方法等效
4 ReentrantLock 类唤醒指定条件线程 object 唤醒机
tryLock lock lockInterruptibly 区
1 tryLock 获锁返回 true立返回 falsetryLock(long timeoutTimeUnit
unit)增加时间限制果超该时间段没获锁返回 false
2 lock 获锁返回 true话直等获锁
3 lock lockInterruptibly果两线程分执行两方法时中断两线程
lock 会抛出异常 lockInterruptibly 会抛出异常
4196 Semaphore 信号量
Semaphore 种基计数信号量设定阈值基线程竞争获取许信
号做完申请超阈值线程申请许信号会阻塞Semaphore
构建象池资源池类数库连接池
实现互斥锁(计数器 1)
创建计数 1 Semaphore作种类似互斥锁机制二元信号量
表示两种互斥状态
代码实现
法:
创建计数阈值 5 信号量象
5 线程时访问
Semaphore semp new Semaphore(5)
try { 申请许
sempacquire()
try {
业务逻辑 13042018 Page 69 of 283
} catch (Exception e) {
} finally {
释放许
semprelease()
}
} catch (InterruptedException e) {
}
Semaphore ReentrantLock
Semaphore 基完成 ReentrantLock 工作方法类似通 acquire()
release()方法获释放界资源实测Semaphoneacquire()方法默认响应中断锁
ReentrantLocklockInterruptibly()作效果致说等界资源程中
Threadinterrupt()方法中断
外Semaphore 实现轮询锁请求定时锁功方法名 tryAcquire tryLock
方法 ReentrantLock 致Semaphore 提供公非公锁机制
构造函数中进行设定
Semaphore 锁释放操作手动进行 ReentrantLock 样避免线程抛出异常
法正常释放锁情况发生释放锁操作必须 finally 代码块中完成
4197 AtomicInteger
首先说明处 AtomicInteger 提供原子操作 Integer 类常见
AtomicBooleanAtomicIntegerAtomicLongAtomicReference 等实现原理相
区运算象类型令兴奋通 AtomicReference
操作转化成原子操作
知道线程程序中诸++i i++等运算具原子性安全线程操作
通常会 synchronized 该操作变成原子操作 JVM 类操作特意提供
步类更方便程序运行效率变更高通相关资料显示通常AtomicInteger
性 ReentantLock 倍
4198 重入锁(递锁)
文里面讲广义重入锁单指 JAVA ReentrantLock重入锁
做递锁指线程 外层函数获锁 层递函数然获取该锁代码受
影响 JAVA 环境 ReentrantLock synchronized 重入锁
13042018 Page 70 of 283
4199 公锁非公锁
公锁(Fair)
加锁前检查否排队等线程优先排队等线程先先
非公锁(Nonfair)
加锁时考虑排队等问题直接尝试获取锁获取动队尾等
1 非公锁性公锁高 5~10 倍公锁需核情况维护队列
2 Java 中 synchronized 非公锁ReentrantLock 默认 lock()方法采非公锁
41910 ReadWriteLock 读写锁
提高性Java 提供读写锁读方读锁写方写锁灵活控制
果没写锁情况读阻塞定程度提高程序执行效率读写锁分读锁写
锁读锁互斥读锁写锁互斥 jvm 控制相应锁
读锁
果代码读数时读时写读锁
写锁
果代码修改数写时读取写锁总读时候
读锁写时候写锁
Java 中读写锁接口 javautilconcurrentlocksReadWriteLock 具体实现
ReentrantReadWriteLock
41911 享锁独占锁
java 发包提供加锁模式分独占锁享锁
独占锁
独占锁模式次线程持锁ReentrantLock 独占方式实现互斥锁
独占锁种悲观保守加锁策略避免读读突果某读线程获取锁读线
程等种情况限制必发性读操作会影响数致性
享锁
享锁允许线程时获取锁发访问 享资源:ReadWriteLock享锁种
乐观锁放宽加锁策略允许执行读操作线程时访问享资源
1 AQS 部类 Node 定义两常量 SHARED EXCLUSIVE分标识 AQS 队列中等
线程锁获取模式
2 java 发包中提供 ReadWriteLock读写锁允许资源读操作访问
者 写操作访问两者时进行 13042018 Page 71 of 283
41912 重量级锁(Mutex Lock)
Synchronized 通象部做监视器锁(monitor)实现监视器锁质
赖底层操作系统 Mutex Lock 实现操作系统实现线程间切换需
户态转换核心态成非常高状态间转换需相较长时间什
Synchronized 效率低原种赖操作系统 Mutex Lock 实现锁称
重量级锁JDK 中 Synchronized 做种种优化核心减少种重量级锁
JDK16 减少获锁释放锁带性消耗提高性引入轻量级锁
偏锁
41913 轻量级锁
锁状态总四种:锁状态偏锁轻量级锁重量级锁
锁升级
着锁竞争锁偏锁升级轻量级锁升级重量级锁(锁升级单
说低高升级会出现锁降级)
轻量级相操作系统互斥量实现传统锁言首先需强调点
轻量级锁代重量级锁意没线程竞争前提减少传统重量
级锁产生性消耗解释轻量级锁执行程前先明白点轻量级锁适应场
景线程交执行步块情况果存时间访问锁情况会导致轻量级锁膨胀
重量级锁
41914 偏锁
Hotspot 作者研究发现数情况锁仅存线程竞争总线
程次获偏锁目某线程获锁消线程锁重入(CAS)开销起
线程偏护引入偏锁线程竞争情况量减少必轻量级
锁执行路径轻量级锁获取释放赖次 CAS 原子指令偏锁需置换
ThreadID 时候赖次 CAS 原子指令(旦出现线程竞争情况必须撤销偏锁
偏锁撤销操作性损耗必须节省 CAS 原子指令性消耗)面说轻
量级锁线程交执行步块时提高性偏锁线程执行步块时进
步提高性
41915 分段锁
分段锁非种实际锁种思想 ConcurrentHashMap 学分段锁实践
41916 锁优化
13042018 Page 72 of 283
减少锁持时间
线程安全求程序加锁
减锁粒度
象(象会线程访问)拆成象增加行度降低锁竞争
降低锁竞争偏锁轻量级锁成功率会提高典型减锁粒度案例
ConcurrentHashMap
锁分离
常见锁分离读写锁 ReadWriteLock根功进行分离成读锁写锁样读读互
斥读写互斥写写互斥保证线程安全提高性具体请查[高发 Java 五]
JDK 发包 1读写分离思想延伸操作互影响锁分离
LinkedBlockingQueue 头部取出尾部放数
锁粗化
通常情况保证线程间效发会求线程持锁时间量短完
公资源应该立释放锁事度果锁停进行请求步
释放身会消耗系统宝贵资源反利性优化
锁消
锁消编译器级事情时编译器时果发现享象消
象锁操作数程序员编码规范引起
参考:httpswwwjianshucomp39628e1180a9
4110 线程基方法
线程相关基方法 waitnotifynotifyAllsleepjoinyield 等 13042018 Page 73 of 283
41101 线程等(wait)
调该方法线程进入 WAITING 状态等外线程通知中断会返回需注意
调 wait()方法会释放象锁wait 方法般步方法步代码块中
41102 线程睡眠(sleep)
sleep 导致前线程休眠 wait 方法 sleep 会释放前占锁sleep(long)会导致
线程进入 TIMEDWATING 状态 wait()方法会导致前线程进入 WATING 状态
41103 线程步(yield)
yield 会前线程出 CPU 执行时间片线程起重新竞争 CPU 时间片般情况
优先级高线程更性成功竞争 CPU 时间片绝操作系统
线程优先级敏感
41104 线程中断(interrupt)
中断线程意线程通知信号会影响线程部中断标识位
线程身会改变状态(阻塞终止等)
1 调 interrupt()方法会中断正运行线程说处 Running 状态线
程会中断终止仅仅改变部维护中断标识位已
2 调 sleep()线程处 TIMEDWATING 状态时调 interrupt()方法会抛出
InterruptedException线程提前结束 TIMEDWATING 状态 13042018 Page 74 of 283
3 许声明抛出 InterruptedException 方法( Threadsleep(long mills 方法))抛出异
常前会清中断标识位抛出异常调 isInterrupted()方法会返回 false
4 中断状态线程固标识位通标识位安全终止线程想终止
线程 thread 时候调 threadinterrupt()方法线程 run 方法部
根 threadisInterrupted()值优雅终止线程
41105 Join 等线程终止
join() 方法等线程终止前线程中调线程 join() 方法前线程转阻塞
状态回线程结束前线程阻塞状态变绪状态等 cpu 宠幸
41106 什 join()方法?
情况线程生成启动子线程需子线程返回结果需线程需
子线程结束结束时候 join() 方法
Systemoutprintln(ThreadcurrentThread()getName() + 线程运行开始)
Thread6 thread1 new Thread6()
thread1setName(线程 B)
thread1join()
Systemoutprintln(时 thread1 执行完毕执行线程)
41107 线程唤醒(notify)
Object 类中 notify() 方法唤醒象监视器等单线程果线程象
等会选择唤醒中线程选择意实现做出决定时发生线程通调
中 wait() 方法象监视器等直前线程放弃象锁定继
续执行唤醒线程唤醒线程常规方式该象动步线程进行竞
争类似方法 notifyAll() 唤醒次监视器等线程
41108 方法:
1 sleep():强迫线程睡眠N毫秒
2 isAlive(): 判断线程否存活
3 join(): 等线程终止
4 activeCount(): 程序中活跃线程数
5 enumerate(): 枚举程序中线程
6 currentThread(): 前线程
7 isDaemon(): 线程否守护线程
8 setDaemon(): 设置线程守护线程(户线程守护线程区否等线
程赖线程结束结束)
9 setName(): 线程设置名称
10 wait(): 强迫线程等 13042018 Page 75 of 283
11 notify(): 通知线程继续运行
12 setPriority(): 设置线程优先级
13 getPriority():获线程优先级
4111 线程文切换
巧妙利时间片轮转方式 CPU 务服务定时间然前务状态保存
加载务状态继续服务务务状态保存加载 段程做
文切换时间片轮转方式务颗 CPU 执行变成
41111 进程
(时候称做务)指程序运行实例 Linux 系统中线程行运行
父进程(创建进程)享址空间(段存区域)资源轻量
级进程
41112 文
指某时间点 CPU 寄存器程序计数器容
41113 寄存器
CPU 部数量较少速度快存(应 CPU 外部相较慢 RAM
存)寄存器通常值(通常运算中间值)快速访问提高计算机程序运行速
度
41114 程序计数器
专寄存器表明指令序列中 CPU 正执行位置存值正执行指令
位置者执行指令位置具体赖特定系统
41115 PCB切换桢
文切换认核(操作系统核心) CPU 进程(包括线程)进行切换
文切换程中信息保存进程控制块(PCB process control block)中PCB 常称
作切换桢(switchframe)信息会直保存 CPU 存中直次 13042018 Page 76 of 283
41116 文切换活动:
1 挂起进程进程 CPU 中状态(文)存储存中某处
2 存中检索进程文 CPU 寄存器中恢复
3 跳转程序计数器指位置(跳转进程中断时代码行)恢复该进程程序
中
41117 引起线程文切换原
1 前执行务时间片完系统 CPU 正常调度务
2 前执行务碰 IO 阻塞调度器务挂起继续务
3 务抢占锁资源前务没抢锁资源调度器挂起继续务
4 户代码挂起前务出 CPU 时间
5 硬件中断
4112 步锁死锁
41121 步锁
线程时访问数时容易出现问题避免种情况出现保证线程
步互斥指发执行线程时间允许线程访问享数 Java 中
synchronized 关键字取象步锁
41122 死锁
死锁线程时阻塞中者全部等某资源释放
4113 线程池原理
线程池做工作控制运行线程数量处理程中务放入队列然线程创建
启动务果线程数量超数量超出数量线程排队等候等线程执行完毕
队列中取出务执行特点:线程复控制发数理线程
41131 线程复
Thread 类 start 方法 调 start 启动线程时 Java 虚拟机会调该类 run
方法 该类 run() 方法中调 Runnable 象 run() 方法 继承重写
Thread 类 start 方法中添加断循环调传递 Runnable 象 线程池实
现原理循环方法中断获取 Runnable Queue 实现获取 Runnable 前
阻塞
41132 线程池组成
般线程池分 4 组成部分: 13042018 Page 77 of 283
1 线程池理器:创建理线程池
2 工作线程:线程池中线程
3 务接口:务必须实现接口工作线程调度运行
4 务队列:存放处理务提供种缓机制
Java 中线程池通 Executor 框架实现该框架中 ExecutorExecutors
ExecutorServiceThreadPoolExecutor Callable FutureFutureTask 类
ThreadPoolExecutor 构造方法:
public ThreadPoolExecutor(int corePoolSizeint maximumPoolSize long keepAliveTime
TimeUnit unit BlockingQueue
this(corePoolSize maximumPoolSize keepAliveTime unit workQueue
ExecutorsdefaultThreadFactory() defaultHandler)
}
1 corePoolSize:指定线程池中线程数量
2 maximumPoolSize:指定线程池中线程数量
3 keepAliveTime:前线程池数量超 corePoolSize 时余空闲线程存活时间
次时间会销毁
4 unit:keepAliveTime 单位
5 workQueue:务队列提交尚未执行务
6 threadFactory:线程工厂创建线程般默认
7 handler:拒绝策略务太处理拒绝务 13042018 Page 78 of 283
41133 拒绝策略
线程池中线程已完法继续新务服务时等队列已排满
塞新务时候需拒绝策略机制合理处理问题
JDK 置拒绝策略:
1 AbortPolicy : 直接抛出异常阻止系统正常运行
2 CallerRunsPolicy : 线程池未关闭该策略直接调者线程中运行前丢弃
务显然样做会真丢弃务务提交线程性极会急剧降
3 DiscardOldestPolicy : 丢弃老请求执行务尝试
次提交前务
4 DiscardPolicy : 该策略默默丢弃法处理务予处理果允许务丢
失种方案
置拒绝策略均实现 RejectedExecutionHandler 接口策略法满足实际
需完全扩展 RejectedExecutionHandler 接口
41134 Java 线程池工作程
1 线程池刚创建时里面没线程务队列作参数传进算队列里面
务线程池会马执行
2 调 execute() 方法添加务时线程池会做判断:
a) 果正运行线程数量 corePoolSize马创建线程运行务
b) 果正运行线程数量等 corePoolSize务放入队列
c) 果时候队列满正运行线程数量 maximumPoolSize
创建非核心线程立刻运行务
d) 果队列满正运行线程数量等 maximumPoolSize线程池
会抛出异常 RejectExecutionException
3 线程完成务时会队列中取务执行
4 线程事做超定时间(keepAliveTime)时线程池会判断果前运
行线程数 corePoolSize线程停掉线程池务完成
终会收缩 corePoolSize 13042018 Page 79 of 283
4114 JAVA 阻塞队列原理
阻塞队列关键字阻塞先理解阻塞含义阻塞队列中线程阻塞样两种情况:
1 队列中没数情况消费者端线程会动阻塞(挂起)直数放
入队列
2 队列中填满数情况生产者端线程会动阻塞(挂起)直队列中
空位置线程动唤醒
13042018 Page 80 of 283
41141 阻塞队列方法
抛出异常:抛出异常
特殊值:返回特殊值(null false视情况定)
塞:成功操作前直阻塞线程
超时:放弃前时间阻塞
插入操作:
1:public abstract boolean add(E paramE):指定元素插入队列中(果立行
会违反容量限制)成功时返回 true果前没空间抛
出 IllegalStateException果该元素 NULL会抛出 NullPointerException 异常
2:public abstract boolean offer(E paramE):指定元素插入队列中(果立行
会违反容量限制)成功时返回 true果前没空间返回 false
3:public abstract void put(E paramE) throws InterruptedException: 指定元素插
入队列中等空间(果必)
public void put(E paramE) throws InterruptedException {
checkNotNull(paramE)
ReentrantLock localReentrantLock thislock
localReentrantLocklockInterruptibly()
try {
while (thiscount thisitemslength)
thisnotFullawait()果队列满线程阻塞等
enqueue(paramE) 13042018 Page 81 of 283
localReentrantLockunlock()
} finally {
localReentrantLockunlock()
}
}
4:offer(E o long timeout TimeUnit unit):设定等时间果指定时间
队列中加入 BlockingQueue返回失败
获取数操作:
1:poll(time)取走 BlockingQueue 里排首位象立取出等 time 参数
规定时间取时返回 null
2:poll(long timeout TimeUnit unit): BlockingQueue 取出队首象果
指定时间队列旦数取立返回队列中数否直时间超时没数
取返回失败
3:take()取走 BlockingQueue 里排首位象 BlockingQueue 空阻断进入等状
态直 BlockingQueue 新数加入
4drainTo()次性 BlockingQueue 获取数象(指定获取数
数)通该方法提升获取数效率需次分批加锁释放锁
41142 Java 中阻塞队列
1 ArrayBlockingQueue :数组结构组成界阻塞队列
2 LinkedBlockingQueue :链表结构组成界阻塞队列
3 PriorityBlockingQueue :支持优先级排序界阻塞队列
4 DelayQueue:优先级队列实现界阻塞队列
5 SynchronousQueue:存储元素阻塞队列
6 LinkedTransferQueue:链表结构组成界阻塞队列
7 LinkedBlockingDeque:链表结构组成双阻塞队列 13042018 Page 82 of 283
41143 ArrayBlockingQueue(公非公)
数组实现界阻塞队列队列先进先出(FIFO)原元素进行排序默认情况
保证访问者公访问队列谓公访问队列指阻塞生产者线程消费者线程
队列时阻塞先序访问队列先阻塞生产者线程先队列里插入
元素先阻塞消费者线程先队列里获取元素通常情况保证公性会降低吞吐
量代码创建公阻塞队列:
ArrayBlockingQueue fairQueue new ArrayBlockingQueue(1000true)
41144 LinkedBlockingQueue(两独立锁提高发)
基链表阻塞队列 ArrayListBlockingQueue 类似队列先进先出(FIFO)原
元素进行排序 LinkedBlockingQueue 够高效处理发数生产者
端消费者端分采独立锁控制数步意味着高发情况生产者消费
者行操作队列中数提高整队列发性
LinkedBlockingQueue 会默认类似限容量(IntegerMAX_VALUE)
41145 PriorityBlockingQueue(compareTo 排序实现优先)
支持优先级界队列默认情况元素采取然序升序排列定义实现
compareTo()方法指定元素进行排序规者初始化 PriorityBlockingQueue 时指定构造
参数 Comparator 元素进行排序需注意保证优先级元素序
41146 DelayQueue(缓存失效定时务 )
支持延时获取元素界阻塞队列队列 PriorityQueue 实现队列中元素必须实
现 Delayed 接口创建元素时指定久队列中获取前元素延迟期满时
队列中提取元素 DelayQueue 运应场景:
1 缓存系统设计: DelayQueue 保存缓存元素效期线程循环查询
DelayQueue旦 DelayQueue 中获取元素时表示缓存效期 13042018 Page 83 of 283
2 定时务调度: DelayQueue 保存天会执行务执行时间旦
DelayQueue 中获取务开始执行 TimerQueue DelayQueue 实现
41147 SynchronousQueue(存储数传递数)
存储元素阻塞队列 put 操作必须等 take 操作否继续添加元素
SynchronousQueue 成传球手负责生产者线程处理数直接传递消费者线
程队列身存储元素非常适合传递性场景线程中数传递
外线程SynchronousQueue 吞吐量高 LinkedBlockingQueue
ArrayBlockingQueue
41148 LinkedTransferQueue
链表结构组成界阻塞 TransferQueue 队列相阻塞队列
LinkedTransferQueue tryTransfer transfer 方法
1 transfer 方法:果前消费者正等接收元素(消费者 take()方法带时间限制
poll()方法时)transfer 方法生产者传入元素立刻 transfer(传输)消费者
果没消费者等接收元素transfer 方法会元素存放队列 tail 节点等该元素
消费者消费返回
2 tryTransfer 方法试探生产者传入元素否直接传消费者果没消费
者等接收元素返回 false transfer 方法区 tryTransfer 方法消费者否
接收方法立返回 transfer 方法必须等消费者消费返回
带时间限制 tryTransfer(E e long timeout TimeUnit unit)方法试图生产者传
入元素直接传消费者果没消费者消费该元素等指定时间返回果超时
没消费元素返回 false果超时时间消费元素返回 true
41149 LinkedBlockingDeque
链表结构组成双阻塞队列谓双队列指队列两端插入移出元素
双端队列操作队列入口线程时入队时减少半竞争相
阻塞队列LinkedBlockingDeque addFirst addLast offerFirst offerLast
peekFirstpeekLast 等方法 First 单词结尾方法表示插入获取(peek)移双端队
列第元素 Last 单词结尾方法表示插入获取移双端队列元素
外插入方法 add 等 addLast移方法 remove 等效 removeFirst take 方法等
takeFirst知道 Jdk bug时带 First Last 缀方法更清楚
初始化 LinkedBlockingDeque 时设置容量防止渡膨胀外双阻塞队列运
工作窃取模式中 13042018 Page 84 of 283
4115 CyclicBarrierCountDownLatchSemaphore 法
41151 CountDownLatch(线程计数器 )
CountDownLatch 类位 javautilconcurrent 包利实现类似计数器功
务 A等 4 务执行完毕执行时利 CountDownLatch
实现种功
final CountDownLatch latch new CountDownLatch(2)
new Thread(){public void run() {
Systemoutprintln(子线程+ThreadcurrentThread()getName()+正执行)
Threadsleep(3000)
Systemoutprintln(子线程+ThreadcurrentThread()getName()+执行完毕)
latchcountDown()
}}start()
new Thread(){ public void run() {
Systemoutprintln(子线程+ThreadcurrentThread()getName()+正执行)
Threadsleep(3000)
Systemoutprintln(子线程+ThreadcurrentThread()getName()+执行完毕)
latchcountDown()
}}start()
Systemoutprintln(等 2 子线程执行完毕)
latchawait()
Systemoutprintln(2 子线程已执行完毕)
Systemoutprintln(继续执行线程)
}
41152 CyclicBarrier(回环栅栏等 barrier 状态全部时执行)
字面意思回环栅栏通实现组线程等某状态全部时执行做回环
等线程释放CyclicBarrier 重暂状态做
barrier调 await()方法线程处 barrier
CyclicBarrier 中重方法 await 方法 2 重载版:
1 public int await():挂起前线程直线程达 barrier 状态时执行续
务
2 public int await(long timeout TimeUnit unit):线程等定时间果
线程没达 barrier 状态直接达 barrier 线程执行续务 13042018 Page 85 of 283
具体外 CyclicBarrier 重
public static void main(String[] args) {
int N 4
CyclicBarrier barrier new CyclicBarrier(N)
for(int i0i
}
static class Writer extends Thread{
private CyclicBarrier cyclicBarrier
public Writer(CyclicBarrier cyclicBarrier) {
thiscyclicBarrier cyclicBarrier
}
@Override
public void run() {
try {
Threadsleep(5000) 睡眠模拟线程需预定写入数操作
Systemoutprintln( 线程+ThreadcurrentThread()getName()+ 写入数完
毕等线程写入完毕)
cyclicBarrierawait()
} catch (InterruptedException e) {
eprintStackTrace()
}catch(BrokenBarrierException e){
eprintStackTrace()
}
Systemoutprintln(线程写入完毕继续处理务数操作)
}
}
41153 Semaphore(信号量控制时访问线程数)
Semaphore 翻译成字面意思 信号量Semaphore 控制时访问线程数通
acquire() 获取许果没等 release() 释放许
Semaphore 类中较重方法:
1 public void acquire() 获取许许够获会直等直获许
2 public void acquire(int permits)获取 permits 许
3 public void release() { } 释放许注意释放许前必须先获获许
4 public void release(int permits) { }释放 permits 许
面 4 方法会阻塞果想立执行结果面方法 13042018 Page 86 of 283
1 public boolean tryAcquire()尝试获取许获取成功立返回 true获取失
败立返回 false
2 public boolean tryAcquire(long timeout TimeUnit unit)尝试获取许指定
时间获取成功立返回 true否立返回 false
3 public boolean tryAcquire(int permits)尝试获取 permits 许获取成功立返
回 true获取失败立返回 false
4 public boolean tryAcquire(int permits long timeout TimeUnit unit) 尝试获取 permits
许指定时间获取成功立返回 true否立返回 false
5 通 availablePermits()方法许数目
例子:工厂 5 台机器 8 工台机器时工完
工继续通 Semaphore 实现:
int N 8 工数
Semaphore semaphore new Semaphore(5) 机器数目
for(int i0i
}
static class Worker extends Thread{
private int num
private Semaphore semaphore
public Worker(int numSemaphore semaphore){
thisnum num
thissemaphore semaphore
}
@Override
public void run() {
try {
semaphoreacquire()
Systemoutprintln(工+thisnum+占机器生产)
Threadsleep(2000)
Systemoutprintln(工+thisnum+释放出机器)
semaphorerelease()
} catch (InterruptedException e) {
eprintStackTrace()
}
}
CountDownLatch CyclicBarrier 够实现线程间等侧重点
CountDownLatch 般某线程 A 等干线程执行完务13042018 Page 87 of 283
执行 CyclicBarrier 般组线程互相等某状态然组线程时
执行外CountDownLatch 够重 CyclicBarrier 重
Semaphore 实锁点类似般控制某组资源访问权限
4116 volatile 关键字作(变量见性禁止重排序)
Java 语言提供种稍弱步机制 volatile 变量确保变量更新操作通知
线程volatile 变量具备两种特性volatile 变量会缓存寄存器者处理器见
方读取 volatile 类型变量时总会返回新写入值
变量见性
保证该变量线程见里见性指线程修改变量值新
值线程立获取
禁止重排序
volatile 禁止指令重排
sychronized 更轻量级步锁
访问 volatile 变量时会执行加锁操作会执行线程阻塞 volatile 变量
种 sychronized 关键字更轻量级步机制volatile 适合种场景:变量线程
享线程直接变量赋值
非 volatile 变量进行读写时候线程先存拷贝变量 CPU 缓存中果计算机
CPU线程 CPU 处理意味着线程拷贝 CPU
cache 中声明变量 volatile JVM 保证次读变量存中读跳 CPU cache
步
适场景
值说明 volatile 变量单次读写操作保证原子性 long double 类型变量
保证 i++种操作原子性质 i++读写两次操作某场景
代 Synchronizedvolatile 完全取代 Synchronized 位置特殊场13042018 Page 88 of 283
景适 volatile总说必须时满足面两条件保证发环境线程安
全:
(1)变量写操作赖前值( i++)者说单纯变量赋值(boolean
flag true)
(2)该变量没包含具变量变式中说 volatile 变量间
互相赖状态真正独立程序容时 volatile
4117 两线程间享数
Java 里面进行线程通信方式享存方式享存关注点两:见
性序性原子性Java 存模型(JMM)解决见性序性问题锁解决原子性
问题理想情况希做步互斥常规实现方法:
数抽象成类数操作作类方法
1 数抽象成类数操作作类方法设计容易做
步方法加synchronized
public class MyData {
private int j0
public synchronized void add(){
j++
Systemoutprintln(线程+ThreadcurrentThread()getName()+j :+j)
}
public synchronized void dec(){
j
Systemoutprintln(线程+ThreadcurrentThread()getName()+j :+j)
}
public int getData(){
return j
}
}
public class AddRunnable implements Runnable{
MyData data
public AddRunnable(MyData data){
thisdata data
} 13042018 Page 89 of 283
public void run() {
dataadd()
}
}
public class DecRunnable implements Runnable {
MyData data
public DecRunnable(MyData data){
thisdata data
}
public void run() {
datadec()
}
}
public static void main(String[] args) {
MyData data new MyData()
Runnable add new AddRunnable(data)
Runnable dec new DecRunnable(data)
for(int i0i<2i++){
new Thread(add)start()
new Thread(dec)start()
}
Runnable 象作类部类
2 Runnable 象作类部类享数作类成员变量线程享数
操作方法封装外部类便实现数操作步互斥作部类
Runnable 象调外部类方法
public class MyData {
private int j0
public synchronized void add(){
j++
Systemoutprintln(线程+ThreadcurrentThread()getName()+j :+j)
}
public synchronized void dec(){
j
Systemoutprintln(线程+ThreadcurrentThread()getName()+j :+j)
}
public int getData(){
return j 13042018 Page 90 of 283
}
}
public class TestThread {
public static void main(String[] args) {
final MyData data new MyData()
for(int i0i<2i++){
new Thread(new Runnable(){
public void run() {
dataadd()
}
})start()
new Thread(new Runnable(){
public void run() {
datadec()
}
})start()
}
}
}
4118 ThreadLocal 作(线程存储)
ThreadLocal方做线程变量方做线程存储ThreadLocal 作
提供线程局部变量种变量线程生命周期起作减少线程函数
者组件间公变量传递复杂度
ThreadLocalMap(线程属性)
1 线程中 ThreadLocalMap 类象线程象保持中
线程正确访问象
2 ThreadLocal 静态实例作 key象引保存线程
ThreadLocalMap 中然线程执行处通静态 ThreadLocal 实例 get()方法取
线程保存象避免象作参数传递麻烦
3 ThreadLocalMap 实线程里面属性 Thread 类中定义
ThreadLocalThreadLocalMap threadLocals null 13042018 Page 91 of 283
场景
常见 ThreadLocal 场景 解决 数库连接Session 理等
private static final ThreadLocal threadSession new ThreadLocal()
public static Session getSession() throws InfrastructureException {
Session s (Session) threadSessionget()
try {
if (s null) {
s getSessionFactory()openSession()
threadSessionset(s)
}
} catch (HibernateException ex) {
throw new InfrastructureException(ex)
}
return s
}
4119 synchronized ReentrantLock 区
41191 两者点:
1 协调线程享象变量访问
2 重入锁线程次获锁
3 保证见性互斥性 13042018 Page 92 of 283
41192 两者点:
1 ReentrantLock 显示获释放锁synchronized 隐式获释放锁
2 ReentrantLock 响应中断轮回synchronized 响应中断处理锁
性提供更高灵活性
3 ReentrantLock API 级synchronized JVM 级
4 ReentrantLock 实现公锁
5 ReentrantLock 通 Condition 绑定条件
6 底层实现样 synchronized 步阻塞悲观发策略lock 步非阻
塞采乐观发策略
7 Lock 接口 synchronized Java 中关键字synchronized 置语言
实现
8 synchronized 发生异常时会动释放线程占锁会导致死锁现象发生
Lock 发生异常时果没动通 unLock()释放锁造成死锁现象
Lock 时需 finally 块中释放锁
9 Lock 等锁线程响应中断 synchronized 行 synchronized 时
等线程会直等够响应中断
10 通 Lock 知道没成功获取锁 synchronized 法办
11 Lock 提高线程进行读操作效率实现读写锁等
4120 ConcurrentHashMap 发
41201 减锁粒度
减锁粒度指缩锁定象范围减锁突性提高系统发力减
锁粒度种削弱线程锁竞争效手段种技术典型应 ConcurrentHashMap(高
性 HashMap)类实现 HashMap 言重两方法 get set 方法果
整 HashMap 加锁线程安全象加锁粒度太Segment
称 ConcurrentHashMap 发度
41202 ConcurrentHashMap 分段锁
ConcurrentHashMap部细分干 HashMap称段(Segment)默认情况
ConcurrentHashMap 进步细分 16 段锁发度
果需 ConcurrentHashMap 中添加新表项整 HashMap 加锁首
先根 hashcode 该表项应该存放段中然该段加锁完成 put 操作线程
环境中果线程时进行 put 操作加入表项存放段中线程间
做真正行 13042018 Page 93 of 283
ConcurrentHashMap Segment 数组结构 HashEntry 数组结构组成
ConcurrentHashMap Segment 数组结构 HashEntry 数组结构组成Segment 种
重入锁 ReentrantLock ConcurrentHashMap 里扮演锁角色HashEntry 存储键值
数 ConcurrentHashMap 里包含 Segment 数组Segment 结构 HashMap
类似种数组链表结构 Segment 里包含 HashEntry 数组 HashEntry
链表结构元素 Segment 守护 HashEntry 数组里元素 HashEntry 数组
数进行修改时必须首先获应 Segment 锁
4121 Java 中线程调度
41211 抢占式调度:
抢占式调度指条线程执行时间线程切换系统控制系统控制指系统某种
运行机制条线程分样执行时间片某线程执行时间片较长甚
某线程执行时间片种机制线程堵塞会导致整进程堵塞
41212 协式调度:
协式调度指某线程执行完动通知系统切换线程执行种模式接力赛样
跑完路程接力棒交接继续跑线程执行时间线程
身控制线程切换预知存线程步问题致命弱点:果线程编
写问题运行半直堵塞导致整系统崩溃 13042018 Page 94 of 283
41213 JVM 线程调度实现(抢占式调度)
java 线程调抢占式调度Java 中线程会优先级分配 CPU 时间片运行优先级越高
越优先执行优先级高代表独占执行时间片优先级高越执行时间
片反优先级低分执行时间少会分配执行时间
41214 线程出 cpu 情况:
1 前运行线程动放弃 CPUJVM 暂时放弃 CPU 操作(基时间片轮转调度 JVM 操作系
统会线程永久放弃 CPU者说放弃次时间片执行权)例调 yield()方法
2 前运行线程某原进入阻塞状态例阻塞 IO
3 前运行线程结束运行完 run()方法里面务
4122 进程调度算法
41221 优先调度算法
1 先先服务调度算法(FCFS)
作业调度中采该算法时次调度备作业队列中选择先进入该队
列作业调入存分配资源创建进程然放入绪队列进程调度中采
FCFS 算法时次调度绪队列中选择先进入该队列进程分配处理机13042018 Page 95 of 283
投入运行该进程直运行完成发生某事件阻塞放弃处理机特点:算法较
简单实现基公
2 短作业(进程)优先调度算法
短作业优先(SJF)调度算法备队列中选择干估计运行时间短作业
调入存运行短进程优先(SPF)调度算法绪队列中选出估计运行时间短进程
处理机分配立执行直执行完成发生某事件阻塞放弃处理机时重
新调度该算法未顾紧迫型作业
41222 高优先权优先调度算法
顾紧迫型作业进入系统便获优先处理引入高优先权优先(FPF)调度
算法该算法作业调度时系统备队列中选择干优先权高作业装入存
进程调度时该算法处理机分配绪队列中优先权高进程
1 非抢占式优先权算法
种方式系统旦处理机分配绪队列中优先权高进程该进程便直执行
直完成发生某事件该进程放弃处理机时种调度算法批处理系统中
某实时性求严实时系统中
2 抢占式优先权调度算法
种方式系统样处理机分配优先权高进程执行执行期间
出现优先权更高进程进程调度程序立停止前进程(原优先权高进程)
执行重新处理机分配新优先权高进程显然种抢占式优先权调度算法
更满足紧迫作业求常求较严格实时系统中性求较高批
处理分时系统中
2.高响应优先调度算法
批处理系统中短作业优先算法种较算法足处长作业运行
保证果作业引入前面述动态优先权作业优先级着等时
间增加速率 a 提高长作业等定时间必然机会分配处理机该优先权
变化规律描述:
(1) 果作业等时间相求服务时间愈短优先权愈高该算法利
短作业
(2) 求服务时间相时作业优先权决定等时间等时间愈长优先权
愈高实现先先服务 13042018 Page 96 of 283
(3) 长作业作业优先级等时间增加提高等时间足够长时
优先级便升高获处理机简言该算法顾短作业考虑作业
达先次序会长作业长期服务该算法实现种较折衷然
利该算法时进行调度前须先做响应计算会增加系统开销
41223 基时间片轮转调度算法
1 时间片轮转法
早期时间片轮转法中系统绪进程先先服务原排成队列次调度
时 CPU 分配队首进程令执行时间片时间片 ms 百 ms执行
时间片完时计时器发出时钟中断请求调度程序便信号停止该进程执行
送绪队列末尾然处理机分配绪队列中新队首进程时执
行时间片样保证绪队列中进程定时间均获时间片处
理机执行时间
2 级反馈队列调度算法
(1) 应设置绪队列队列赋予优先级第队列优先级高第二
队列次余队列优先权逐降低该算法赋予队列中进程执行时间片
相优先权愈高队列中进程规定执行时间片愈例第二队列
时间片第队列时间片长倍……第 i+1 队列时间片第 i 队列时间片长
倍
(2) 新进程进入存首先放入第队列末尾 FCFS 原排队等调度
轮该进程执行时该时间片完成便准备撤离系统果时间片结束时
尚未完成调度程序便该进程转入第二队列末尾样 FCFS 原等调度执行果
第二队列中运行时间片未完成次放入第三队列……
长作业(进程)第队列次降第 n 队列第 n 队列便采取时间片轮转方式运行
(3) 仅第队列空闲时调度程序调度第二队列中进程运行仅第 1~(i1)队列均空时
会调度第 i 队列中进程运行果处理机正第 i 队列中某进程服务时新进程进入优
先权较高队列(第 1~(i1)中队列)时新进程抢占正运行进程处理机
调度程序正运行进程放回第 i 队列末尾处理机分配新高优先权进程
级反馈队列调度算法中果规定第队列时间片略数机交互需处理时间
时便够较满足种类型户需
4123 什 CAS(较交换乐观锁机制锁旋)
41231 概念特性
CAS(Compare And SwapSet)较交换CAS 算法程样:包含 3 参数
CAS(VEN)V 表示更新变量(存值)E 表示预期值(旧)N 表示新值仅 V 值等13042018 Page 97 of 283
E 值时会 V 值设 N果 V 值 E 值说明已线程做更新
前线程什做CAS 返回前 V 真实值
CAS 操作抱着乐观态度进行(乐观锁)总认成功完成操作线程时
CAS 操作变量时会胜出成功更新余均会失败失败线程会挂
起仅告知失败允许次尝试然允许失败线程放弃操作基样原理
CAS 操作没锁发现线程前线程干扰进行恰处理
41232 原子包 javautilconcurrentatomic(锁旋)
JDK15 原子包:javautilconcurrentatomic 包里面提供组原子类基特性
线程环境线程时执行类实例包含方法时具排性某
线程进入方法执行中指令时会线程断线程旋锁样直等
该方法执行完成 JVM 等队列中选择线程进入种逻辑理解
相 synchronized 种阻塞算法CAS 非阻塞算法种常见实现般 CPU 切
换时间 CPU 指令集操作更加长 JUC 性提升代码:
public class AtomicInteger extends Number implements javaioSerializable {
private volatile int value
public final int get() {
return value
}
public final int getAndIncrement() {
for () { CAS 旋直尝试直达成功
int current get()
int next current + 1
if (compareAndSet(current next))
return current
}
}
public final boolean compareAndSet(int expect int update) {
return unsafecompareAndSwapInt(this valueOffset expect update)
}
} 13042018 Page 98 of 283
getAndIncrement 采 CAS 操作次存中读取数然数+1 结果进行
CAS 操作果成功返回结果否重试直成功止 compareAndSet 利 JNI 完成
CPU 指令操作
41233 ABA 问题
CAS 会导致ABA 问题CAS 算法实现重前提需取出存中某时刻数时
刻较换时间差类会导致数变化
说线程 one 存位置 V 中取出 A时候线程 two 存中取出 A
two 进行操作变成 B然 two V 位置数变成 A时候线程 one 进行 CAS 操
作发现存中然 A然 one 操作成功线程 one CAS 操作成功代表
程没问题
部分乐观锁实现通版号(version)方式解决 ABA 问题乐观锁次执行数修
改操作时会带版号旦版号数版号致执行修改操作版
号执行+1 操作否执行失败次操作版号会增加会出现 ABA 问
题版号会增加会减少
4124 什 AQS(抽象队列步器)
AbstractQueuedSynchronizer 类名抽象队列式步器AQS 定义套线程访问
享资源步器框架许步类实现赖常
ReentrantLockSemaphoreCountDownLatch 13042018 Page 99 of 283
维护 volatile int state(代表享资源) FIFO 线程等队列(线程争资源
阻塞时会进入队列)里 volatile 核心关键词具体 volatile 语义述state
访问方式三种
getState()
setState()
compareAndSetState()
AQS 定义两种资源享方式
Exclusive 独占资源ReentrantLock
Exclusive(独占线程执行 ReentrantLock)
Share 享资源SemaphoreCountDownLatch
Share(享线程时执行 SemaphoreCountDownLatch)
AQS 框架具体资源获取释放方式交定义步器实现AQS 里定义
接口具体资源获取交定义步器实现(通 state getsetCAS)没定义成
abstract 独占模式实现 tryAcquiretryRelease 享模式实现
tryAcquireSharedtryReleaseShared果定义成 abstract模式实现模
式接口定义步器争享资源方式定义步器实现时需实
现享资源 state 获取释放方式具体线程等队列维护(获取资源失败入队
唤醒出队等)AQS 已顶层实现定义步器实现时实现种方法:
1. isHeldExclusively():该线程否正独占资源 condition 需实现
2. tryAcquire(int):独占方式尝试获取资源成功返回 true失败返回 false
3. tryRelease(int):独占方式尝试释放资源成功返回 true失败返回 false
4. tryAcquireShared(int):享方式尝试获取资源负数表示失败0 表示成功没剩余
资源正数表示成功剩余资源
5. tryReleaseShared(int):享方式尝试释放资源果释放允许唤醒续等结点返回
true否返回 false 13042018 Page 100 of 283
步器实现 ABS 核心(state 资源状态计数)
步器实现 ABS 核心 ReentrantLock 例state 初始化 0表示未锁定状态A 线程
lock()时会调 tryAcquire()独占该锁 state+1线程 tryAcquire()时会失
败直 A 线程 unlock() state0(释放锁)止线程机会获取该锁然释放
锁前A 线程重复获取锁(state 会累加)重入概念注意
获取少次释放次样保证 state 回零态
CountDownLatch 例务分 N 子线程执行state 初始化 N(注意 N
线程数致) N 子线程行执行子线程执行完 countDown()次state
会 CAS 减 1等子线程执行完( state0)会 unpark()调线程然调线程
会 await()函数返回继续余动作
ReentrantReadWriteLock 实现独占享两种方式
般说定义步器独占方法享方式需实现 tryAcquire
tryReleasetryAcquireSharedtryReleaseShared 中种 AQS 支持定义步器
时实现独占享两种方式 ReentrantReadWriteLock
13042018 Page 101 of 283
5 JAVA 基础
511 JAVA 异常分类处理
5111 概念
果某方法正常途径完成务通种路径退出方法种情况
会抛出封装错误信息象时方法会立刻退出时返回值外调
方法代码法继续执行异常处理机制会代码执行交异常处理器
5112 异常分类
Throwable Java 语言中错误异常超类层分 Error Exception
Error
1 Error 类指 java 运行时系统部错误资源耗错误应程序会抛出该类象果
出现样错误告知户剩力程序安全终止
Exception(RuntimeExceptionCheckedException)
2 Exception 两分支运行时异常 RuntimeException
CheckedException
RuntimeException :NullPointerException ClassCastException 检查异常
CheckedException IO 错误导致 IOExceptionSQLException RuntimeException
Java 虚拟机正常运行期间抛出异常超类 果出现 RuntimeException
定程序员错误 13042018 Page 102 of 283
检查异常 CheckedException:般外部错误种异常发生编译阶段Java 编译器会强
制程序捕获类异常会出现求段出现异常程序进行 try catch该类异常
般包括方面:
1 试图文件尾部读取数
2 试图开错误格式 URL
3 试图根定字符串查找 class 象字符串表示类存
5113 异常处理方式
遇问题进行具体处理继续抛调者 (throwthrows)
抛出异常三种形式 throw throws种系统动抛异常
public static void main(String[] args) {
String s abc
if(sequals(abc)) {
throw new NumberFormatException()
} else {
Systemoutprintln(s)
}
}
int div(int aint b) throws Exception{
return ab}
try catch 捕获异常针性处理方式
5114 Throw throws 区:
位置
1 throws 函数面异常类 throw 函数面
异常象
功:
2 throws 声明异常调者知道该功出现问题出预先处理方
式throw 抛出具体问题象执行 throw功已结束跳转调者
具体问题象抛调者说 throw 语句独立存时面定义语
句执行
3 throws 表示出现异常种性定会发生异常throw 抛出异常
执行 throw 定抛出某种异常象 13042018 Page 103 of 283
4 两者消极处理异常方式抛出者抛出异常会函数处理异
常真正处理异常函数层调处理
512 JAVA 反射
5121 动态语言
动态语言指程序运行时改变结构:新函数引进已函数删等结
构变化常见 JavaScript 动态语言外 RubyPython 等属动态语言
CC++属动态语言反射角度说 JAVA 属半动态语言
5122 反射机制概念 (运行状态中知道类属性方法)
Java 中反射机制指运行状态中意类够知道类属性方法
意象够调意方法种动态获取信息动态调象方
法功成 Java 语言反射机制
5123 反射应场合
编译时类型运行时类型
Java 程序中许象运行会出现两种类型:编译时类型运行时类型 编译时类型
声明象时实类型决定运行时类型实际赋值象类型决定 :
Person pnew Student()
中编译时类型 Person运行时类型 Student 13042018 Page 104 of 283
编译时类型法获取具体方法
程序运行时接收外部传入象该象编译时类型 Object程序需调
该象运行时类型方法解决问题程序需运行时发现象类真实信息
然果编译时根法预知该象类属类程序运行时信息发现该象
类真实信息时必须反射
5124 Java 反射 API
反射 API 生成 JVM 中类接口象信息
1 Class 类:反射核心类获取类属性方法等信息
2 Field 类:Javalangreflec 包中类表示类成员变量获取设置类中属性
值
3 Method 类: Javalangreflec 包中类表示类方法获取类中方法信息
者执行方法
4 Constructor 类: Javalangreflec 包中类表示类构造方法
5125 反射步骤(获取 Class 象调象方法)
1 获取想操作类 Class 象反射核心通 Class 象意调类方
法
2 调 Class 类中方法反射阶段
3 反射 API 操作信息
5126 获取 Class 象 3 种方法
调某象 getClass()方法
Person pnew Person()
Class clazzpgetClass()
调某类 class 属性获取该类应 Class 象
Class clazzPersonclass
Class 类中 forName()静态方法(安全性)
Class clazzClassforName(类全路径) (常)
获想操作类 Class 象通 Class 类中方法获取查该类中方法
属性
获取 Person 类 Class 象
Class clazzClassforName(reflectionPerson) 13042018 Page 105 of 283
获取 Person 类方法信息
Method[] methodclazzgetDeclaredMethods()
for(Method mmethod){
Systemoutprintln(mtoString())
}
获取 Person 类成员属性信息
Field[] fieldclazzgetDeclaredFields()
for(Field ffield){
Systemoutprintln(ftoString())
}
获取 Person 类构造方法信息
Constructor[] constructorclazzgetDeclaredConstructors()
for(Constructor cconstructor){
Systemoutprintln(ctoString())
}
5127 创建象两种方法
Class 象 newInstance()
1 Class 象 newInstance()方法创建该 Class 象应类实例种方法求
该 Class 象应类默认空构造器
调 Constructor 象 newInstance()
2 先 Class 象获取指定 Constructor 象调 Constructor 象 newInstance()
方法创建 Class 象应类实例通种方法选定构造方法创建实例
获取 Person 类 Class 象
Class clazzClassforName(reflectionPerson)
newInstane 方法创建象
Person p(Person) clazznewInstance()
获取构造方法创建象
Constructor cclazzgetDeclaredConstructor(StringclassStringclassintclass)
创建象设置属性 13042018 Page 106 of 283
Person p1(Person) cnewInstance(李四男20)
513 JAVA 注解
5131 概念
Annotation(注解) Java 提供种元程序中元素关联信息元数(metadata)途径
方法Annatation(注解)接口程序通反射获取指定程序中元素 Annotation
象然通该 Annotation 象获取注解中元数信息
5132 4 种标准元注解
元注解作负责注解注解 Java50 定义 4 标准 metaannotation 类型
提供 annotation 类型作说明
@Target 修饰象范围
@Target说明Annotation修饰象范围: Annotation packagestypes(类
接口枚举Annotation 类型)类型成员(方法构造方法成员变量枚举值)方法参数
变量(循环变量catch 参数) Annotation 类型声明中 target 更加明晰
修饰目标
@Retention 定义 保留时间长短
Retention 定义该 Annotation 保留时间长短:表示需什级保存注解信息描
述注解生命周期(:描述注解什范围效)取值(RetentionPoicy):
SOURCE源文件中效(源文件保留)
CLASS class 文件中效( class 保留)
RUNTIME运行时效(运行时保留)
@Documented 描述javadoc
@ Documented 描述类型 annotation 应该作标注程序成员公 API
例 javadoc 类工具文档化
@Inherited 阐述某标注类型继承
@Inherited 元注解标记注解@Inherited 阐述某标注类型继承果
@Inherited 修饰 annotation 类型 class annotation 该
class 子类 13042018 Page 107 of 283
5133 注解处理器
果没读取注解方法工作注解会注释更处注解程中
重部分创建注解处理器Java SE5 扩展反射机制 API帮助程序员快速
构造定义注解处理器面实现注解处理器
1:*** 定义注解*
@Target(ElementTypeFIELD)
@Retention(RetentionPolicyRUNTIME)
@Documented
public @interface FruitProvider {
**供应商编号*
public int id() default 1
*** 供应商名称*
public String name() default 13042018 Page 108 of 283
** * 供应商址*
public String address() default
}
2:注解
public class Apple {
@FruitProvider(id 1 name 陕西红富士集团 address 陕西省西安市延安路)
private String appleProvider
public void setAppleProvider(String appleProvider) {
thisappleProvider appleProvider
}
public String getAppleProvider() {
return appleProvider
}
}
3:*********** 注解处理器 ***************
public class FruitInfoUtil {
public static void getFruitInfo(Class<> clazz) {
String strFruitProvicer 供应商信息:
Field[] fields clazzgetDeclaredFields()通反射获取处理注解
for (Field field fields) {
if (fieldisAnnotationPresent(FruitProviderclass)) {
FruitProvider fruitProvider (FruitProvider) fieldgetAnnotation(FruitProviderclass)
注解信息处理方
strFruitProvicer 供应商编号: + fruitProviderid() + 供应商名称:
+ fruitProvidername() + 供应商址:+ fruitProvideraddress()
Systemoutprintln(strFruitProvicer)
}
}
}
} 13042018 Page 109 of 283
public class FruitRun {
public static void main(String[] args) {
FruitInfoUtilgetFruitInfo(Appleclass)
***********输出结果***************
供应商编号:1 供应商名称:陕西红富士集团 供应商址:陕西省西安市延
}
}
514 JAVA 部类
Java 类中仅定义变量方法定义类样定义类部类称部类根
定义方式部类分静态部类成员部类局部部类匿名部类四种
5141 静态部类
定义类部静态类静态部类
public class Out {
private static int a
private int b
public static class Inner {
public void print() {
Systemoutprintln(a)
}
}
}
1 静态部类访问外部类静态变量方法 private 样
2 静态部类般类致定义静态变量方法构造方法等
3 类静态部类需外部类静态部类方式示:OutInner inner
new OutInner()innerprint()
4 Java集合类HashMap部静态部类EntryEntryHashMap存放元素抽象
HashMap 部维护 Entry 数组存放元素 Entry 者透明种外部
类关系密切赖外部类实例静态部类 13042018 Page 110 of 283
5142 成员部类
定义类部非静态类成员部类成员部类定义静态方法变量(final 修饰
外)成员部类非静态类初始化时候先初始化静态成员果允许成员
部类定义静态变量成员部类静态变量初始化序歧义
public class Out {
private static int a
private int b
public class Inner {
public void print() {
Systemoutprintln(a)
Systemoutprintln(b)
}
}
}
5143 局部部类(定义方法中类)
定义方法中类局部类果类某方法中考虑局部类
public class Out {
private static int a
private int b
public void test(final int c) {
final int d 1
class Inner {
public void print() {
Systemoutprintln(c)
}
}
}
} 13042018 Page 111 of 283
5144 匿名部类(继承父类者实现接口直接
new 生成象引)
匿名部类必须继承父类者实现接口然仅继承父类者实现
接口时没 class 关键字匿名部类直接 new 生成象引
public abstract class Bird {
private String name
public String getName() {
return name
}
public void setName(String name) {
thisname name
}
public abstract int fly()
}
public class Test {
public void test(Bird bird){
Systemoutprintln(birdgetName() + 够飞 + birdfly() + 米)
}
public static void main(String[] args) {
Test test new Test()
testtest(new Bird() {
public int fly() {
return 10000
}
public String getName() {
return 雁
}
})
}
} 13042018 Page 112 of 283
515 JAVA 泛型
泛型提供编译时类型安全检测机制该机制允许程序员编译时检测非法类型泛型
质参数化类型说操作数类型指定参数写排序方法
够整型数组字符串数组甚类型数组进行排序 Java 泛型
5151 泛型方法(
写泛型方法该方法调时接收类型参数根传递泛型方法参数
类型编译器适处理方法调
泛型方法 printArray
public static < E > void printArray( E[] inputArray )
{
for ( E element inputArray ){
Systemoutprintf( s element )
}
}
1 < extends T>表示该通配符代表类型 T 类型子类
2 < super T>表示该通配符代表类型 T 类型父类
5152 泛型类
泛型类声明非泛型类声明类似类名面添加类型参数声明部分泛型方法
样泛型类类型参数声明部分包含类型参数参数间逗号隔开泛型参数
称类型变量指定泛型类型名称标识符接受参数
类称参数化类参数化类型
public class Box
private T t
public void add(T t) {
thist t
}
public T get() {
return t
} 13042018 Page 113 of 283
5153 类型通配符
类型通配符般 代具体类型参数例 List<> 逻辑
List
5154 类型擦
Java 中泛型基编译器层次实现生成 Java 字节代码中包含泛
型中类型信息泛型时候加类型参数会编译器编译时候掉
程称类型擦代码中定义 List