一、共享带来的问题
1.小故事
2.Java 的体现
3.问题分析
4.临界区 Critical Section
5.竞态条件 Race Condition
多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测,称之为发生了竞态条件
二、synchronized 解决方案
1.应用之互斥
2.synchronized
3.思考
4.面向对象改进
三、方法上的 synchronized
1.语法
2.不加 synchronized 的方法
不加 synchronzied 的方法就好比不遵守规则的人,不去老实排队(好比翻窗户进去的)
3.所谓的“线程八锁”
四、变量的线程安全分析
1.成员变量和静态变量是否线程安全?
2.局部变量是否线程安全?
3.局部变量线程安全分析
4.常见线程安全类
5.实例分析
五、习题
1.卖票练习
2.转账练习
六、Monitor 概念
1.Java 对象头
以 32 位虚拟机为例
https://stackoverflow.com/questions/26357186/what-is-in-java-object-header
2.原理之 Monitor(锁)
3.synchronized 原理
4.synchronized 原理进阶
轻量级锁
锁膨胀
自旋优化
偏向锁
锁消除
七、wait notify
1.小故事 - 为什么需要 wait
2.wait notify 原理
3.API 介绍
八、wait notify 的正确姿势
1.step 1
2.step 2
3.step 3
4.step 4
5.step 5
6. 模式之保护性暂停
定义
实现
应用
带超时版 GuardedObject
原理之 join
多任务版 GuardedObject
7.异步模式之生产者/消费者
定义
实现
应用
九、Park & Unpark
1.基本使用
2.原理之 park & unpark
十、重新理解线程状态转换
十一、多把锁
十二、活跃性
1.死锁
2.定位死锁
3.哲学家就餐问题
-------------------------------------------------------------------------
名称: 阿基米德
状态: 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)
这种线程没有按预期结束,执行不下去的情况,归类为【活跃性】问题,除了死锁以外,还有活锁和饥饿者两种情况