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