- 过度竞争
- 过多线程尝试同时使用一个共享资源
- 同步
- 直接相互制约
- 实现
- 同步原语(如通道、锁)作用时,会刷处理器缓存到内存并提交,保证可见性
- 互斥
- 间接相互制约
- 竞态条件(race condition)
- 临界区
- 只能一线程访问的代码,如lock了的代码
- 监控模式
- 互斥锁, 函数, 变量 组合出临界区的模式, 使用了代理人(broker)(指锁)
- 异步
- 与同步相对。多线程是实现异步的一种手段
- 可见性
- 线程总可见到最后修改的数据, 脏读是反例
- 原子性
- 查看和修改同时发生
- 乱序执行
- java 中标记volatile的变量可以不乱序执行, 现多用原子变量
- 编译器或JVM的静态优化可以打乱代码执行顺序(java)
- 硬件可以通过乱序执行来优化性
- 死锁
- 多线程竞争资源而互相等待
- 条件
- 互斥
- 资源排他
- 不剥夺
- 资源不被外力剥夺
- 请求和保持条件
- 线程已保持一个资源,请求新资源。请求被阻塞而自己资源保持
- 循环等待
- 阻塞线程形成环
- 互斥
- 方案
- 锁按顺序获得
- a,b,c锁,要得c手中要有a, b
- 使用锁的地方比较零散时,遵守此顺序变得不实际
- 可以用对象散列值作全局顺序减小死锁机率
- 阻塞加时限
- 外星方法中可能包含另一把锁,要避免在持锁时调用外星方法
- 锁按顺序获得
- 活锁
- 多线程尝试绕开死锁而过分同步反复冲突