共享模型之管程

一、共享带来的问题

1.小故事

共享模型之管程_堆栈
共享模型之管程_堆栈_02
共享模型之管程_java_03
共享模型之管程_死锁_04

2.Java 的体现

共享模型之管程_死锁_05

3.问题分析

共享模型之管程_堆栈_06
共享模型之管程_多线程_07
共享模型之管程_多线程_08
共享模型之管程_堆栈_09
共享模型之管程_死锁_10

4.临界区 Critical Section

共享模型之管程_死锁_11
共享模型之管程_线程安全_12

5.竞态条件 Race Condition

多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测,称之为发生了竞态条件

二、synchronized 解决方案

1.应用之互斥

共享模型之管程_多线程_13

2.synchronized

共享模型之管程_堆栈_14
共享模型之管程_死锁_15
共享模型之管程_java_16
共享模型之管程_死锁_17

3.思考

共享模型之管程_多线程_18
共享模型之管程_java_19

4.面向对象改进

共享模型之管程_多线程_20
共享模型之管程_线程安全_21

三、方法上的 synchronized

1.语法

共享模型之管程_死锁_22

2.不加 synchronized 的方法

不加 synchronzied 的方法就好比不遵守规则的人,不去老实排队(好比翻窗户进去的)

3.所谓的“线程八锁”

共享模型之管程_java_23
共享模型之管程_死锁_24
共享模型之管程_java_25
共享模型之管程_多线程_26
共享模型之管程_多线程_27
共享模型之管程_java_28
共享模型之管程_死锁_29

四、变量的线程安全分析

1.成员变量和静态变量是否线程安全?

共享模型之管程_堆栈_30

2.局部变量是否线程安全?

共享模型之管程_死锁_31

3.局部变量线程安全分析

共享模型之管程_多线程_32
共享模型之管程_堆栈_33
共享模型之管程_堆栈_34
共享模型之管程_堆栈_35
共享模型之管程_堆栈_36
共享模型之管程_多线程_37
共享模型之管程_堆栈_38
共享模型之管程_死锁_39
共享模型之管程_堆栈_40
共享模型之管程_java_41

4.常见线程安全类

共享模型之管程_线程安全_42
共享模型之管程_多线程_43
共享模型之管程_java_44

5.实例分析

共享模型之管程_死锁_45
共享模型之管程_多线程_46
共享模型之管程_java_47
共享模型之管程_多线程_48
共享模型之管程_线程安全_49
共享模型之管程_多线程_50
共享模型之管程_多线程_51
共享模型之管程_死锁_52
共享模型之管程_线程安全_53
共享模型之管程_堆栈_54
共享模型之管程_死锁_55

五、习题

1.卖票练习

共享模型之管程_线程安全_56
共享模型之管程_堆栈_57

2.转账练习

共享模型之管程_java_58
共享模型之管程_java_59

六、Monitor 概念

1.Java 对象头

以 32 位虚拟机为例
共享模型之管程_死锁_60
共享模型之管程_死锁_61
https://stackoverflow.com/questions/26357186/what-is-in-java-object-header

2.原理之 Monitor(锁)

共享模型之管程_线程安全_62

3.synchronized 原理

共享模型之管程_java_63
共享模型之管程_java_64
共享模型之管程_多线程_65

4.synchronized 原理进阶

轻量级锁

共享模型之管程_线程安全_66
共享模型之管程_线程安全_67
共享模型之管程_死锁_68
共享模型之管程_多线程_69
共享模型之管程_死锁_70
共享模型之管程_java_71

锁膨胀

共享模型之管程_多线程_72
共享模型之管程_死锁_73

自旋优化

共享模型之管程_堆栈_74
共享模型之管程_java_75

偏向锁

共享模型之管程_死锁_76
共享模型之管程_堆栈_77
共享模型之管程_堆栈_78
共享模型之管程_多线程_79
共享模型之管程_死锁_80
共享模型之管程_堆栈_81
共享模型之管程_java_82
共享模型之管程_java_83
共享模型之管程_堆栈_84
共享模型之管程_线程安全_85
共享模型之管程_死锁_86
共享模型之管程_线程安全_87
共享模型之管程_死锁_88
共享模型之管程_线程安全_89
共享模型之管程_多线程_90

锁消除

共享模型之管程_java_91
共享模型之管程_多线程_92

七、wait notify

1.小故事 - 为什么需要 wait

共享模型之管程_线程安全_93

2.wait notify 原理

共享模型之管程_堆栈_94

3.API 介绍

共享模型之管程_多线程_95
共享模型之管程_多线程_96
共享模型之管程_线程安全_97

八、wait notify 的正确姿势

共享模型之管程_线程安全_98

1.step 1

共享模型之管程_多线程_99
共享模型之管程_死锁_100

2.step 2

共享模型之管程_线程安全_101
共享模型之管程_堆栈_102

3.step 3

共享模型之管程_堆栈_103
共享模型之管程_线程安全_104

4.step 4

共享模型之管程_死锁_105

5.step 5

共享模型之管程_堆栈_106
共享模型之管程_线程安全_107

6. 模式之保护性暂停

定义

共享模型之管程_线程安全_108

实现

共享模型之管程_堆栈_109
共享模型之管程_死锁_110

应用

共享模型之管程_死锁_111

带超时版 GuardedObject

共享模型之管程_java_112
共享模型之管程_堆栈_113
共享模型之管程_多线程_114
共享模型之管程_java_115

原理之 join

共享模型之管程_堆栈_116
共享模型之管程_java_117

多任务版 GuardedObject

共享模型之管程_多线程_118
共享模型之管程_java_119
共享模型之管程_死锁_120
共享模型之管程_多线程_121
共享模型之管程_线程安全_122
共享模型之管程_线程安全_123
共享模型之管程_堆栈_124

7.异步模式之生产者/消费者

定义

共享模型之管程_线程安全_125

实现

共享模型之管程_死锁_126
共享模型之管程_线程安全_127

应用

共享模型之管程_线程安全_128
共享模型之管程_多线程_129

九、Park & Unpark

1.基本使用

共享模型之管程_多线程_130
共享模型之管程_多线程_131
共享模型之管程_线程安全_132

2.原理之 park & unpark

共享模型之管程_死锁_133
共享模型之管程_堆栈_134
共享模型之管程_堆栈_135

十、重新理解线程状态转换

共享模型之管程_堆栈_136
共享模型之管程_堆栈_137
共享模型之管程_多线程_138
共享模型之管程_堆栈_139
共享模型之管程_多线程_140
共享模型之管程_堆栈_141

十一、多把锁

共享模型之管程_堆栈_142
共享模型之管程_多线程_143
共享模型之管程_java_144

十二、活跃性

1.死锁

共享模型之管程_线程安全_145
共享模型之管程_堆栈_146

2.定位死锁

共享模型之管程_线程安全_147
共享模型之管程_堆栈_148

3.哲学家就餐问题

共享模型之管程_死锁_149
共享模型之管程_java_150
共享模型之管程_死锁_151
共享模型之管程_堆栈_152

-------------------------------------------------------------------------
名称: 阿基米德
状态: cn.itcast.Chopstick@1540e19d (筷子1) 上的BLOCKED, 拥有者: 苏格拉底
总阻止数: 2, 总等待数: 1
堆栈跟踪:
cn.itcast.Philosopher.run(TestDinner.java:48)
- 已锁定 cn.itcast.Chopstick@6d6f6e28 (筷子5)
-------------------------------------------------------------------------
名称: 苏格拉底
状态: cn.itcast.Chopstick@677327b6 (筷子2) 上的BLOCKED, 拥有者: 柏拉图
总阻止数: 2, 总等待数: 1
堆栈跟踪:
cn.itcast.Philosopher.run(TestDinner.java:48)
- 已锁定 cn.itcast.Chopstick@1540e19d (筷子1)
-------------------------------------------------------------------------
名称: 柏拉图
状态: cn.itcast.Chopstick@14ae5a5 (筷子3) 上的BLOCKED, 拥有者: 亚里士多德
总阻止数: 2, 总等待数: 0
堆栈跟踪:
cn.itcast.Philosopher.run(TestDinner.java:48)
- 已锁定 cn.itcast.Chopstick@677327b6 (筷子2)
-------------------------------------------------------------------------
名称: 亚里士多德
状态: cn.itcast.Chopstick@7f31245a (筷子4) 上的BLOCKED, 拥有者: 赫拉克利特
总阻止数: 1, 总等待数: 1
堆栈跟踪:
cn.itcast.Philosopher.run(TestDinner.java:48)
- 已锁定 cn.itcast.Chopstick@14ae5a5 (筷子3)
-------------------------------------------------------------------------
名称: 赫拉克利特
状态: cn.itcast.Chopstick@6d6f6e28 (筷子5) 上的BLOCKED, 拥有者: 阿基米德
总阻止数: 2, 总等待数: 0
堆栈跟踪:
cn.itcast.Philosopher.run(TestDinner.java:48)
- 已锁定 cn.itcast.Chopstick@7f31245a (筷子4)

这种线程没有按预期结束,执行不下去的情况,归类为【活跃性】问题,除了死锁以外,还有活锁和饥饿者两种情况

4.活锁

共享模型之管程_java_153
共享模型之管程_死锁_154

5.饥饿

共享模型之管程_死锁_155
共享模型之管程_堆栈_156

十三、ReentrantLock

共享模型之管程_死锁_157

1.可重入

共享模型之管程_多线程_158
共享模型之管程_java_159
共享模型之管程_java_160

2.可打断

共享模型之管程_线程安全_161
共享模型之管程_堆栈_162
共享模型之管程_多线程_163
共享模型之管程_堆栈_164

3.锁超时

共享模型之管程_死锁_165
共享模型之管程_堆栈_166
共享模型之管程_多线程_167
共享模型之管程_线程安全_168
共享模型之管程_死锁_169

4.公平锁

共享模型之管程_java_170
共享模型之管程_线程安全_171
共享模型之管程_线程安全_172

5.条件变量

共享模型之管程_java_173
共享模型之管程_死锁_174
共享模型之管程_多线程_175

6.同步模式之顺序控制

共享模型之管程_多线程_176
共享模型之管程_多线程_177
共享模型之管程_死锁_178
共享模型之管程_多线程_179
共享模型之管程_线程安全_180
共享模型之管程_线程安全_181
共享模型之管程_死锁_182
共享模型之管程_死锁_183
共享模型之管程_线程安全_184