• 死锁分布式锁
  • 1965年提出,1974年改良为monitor。加解锁时,要求对锁的检查和修改同时执行
    • 公平锁 # FIFO取锁
    • 非公平锁 # 每次直接占有
    • 互斥锁(mutex) # 访问前加锁,访问后解锁
      • 悲观锁 # 假设最坏,等所有线程释放成功
        • 读加锁
      • 乐观锁 # 假设最好,有冲突时重试
        • 读不加锁,写时判断数据版本是否修改,再重试
    • 读写锁(rwlock) # 竞争不激烈比互斥锁慢
      • 读锁(共享锁)
      • 写锁(互斥锁)
      • 状态
        • 读加锁状态
          • 可多个线程占用
          • 处理器缓存提交,数据可见
          • 阻塞写线程 # 导致写线程抢占不到资源,所以有写线程时,阻塞后进入的读线程
        • 写加锁状态
          • 一次只有一个线程占用
          • 阻塞所有线程
        • 不加锁状态
    • 自旋锁 spinlock
      • 互斥锁改,自己进入循环等待状态(忙等) # 适合锁持有时间较短
    • RCU锁 Read-Copy Update
      • 读写锁改,一个写线程,读线程无限制
        • 实现垃圾回收器
        • 写线程copy副本修改,向垃圾回收器注册callback以执行真正的修改
        • 垃圾回收器收到信号,所有读线程结束,执行callback
    • 可重入锁 # 互斥锁改,允许同一线程多次获得写锁
    • 管程(monitor)
    • 临界区(critical section)
    • 内置锁、显示锁 # 指java的synchronized与Reentrantlock
  • 信号量
    • 进程, 线程间通知状态
  • CAS
    • compare and swap,无锁算法(lock free), 非阻塞(non-blocking), 构成基本的乐观锁
    • cpu实现的指令
    • 3个操作数
      • V的值为A时,原子更新成B,否则无操作。返回V的值
      • 需要读写的内存位置V
      • 进行比较的值A
      • 拟写入的新值B
  • 函数式
    • 介绍
      • 消除可变状态
    • 概念
      • 命令式语言中,求值顺序与源码的语句顺序紧密相关(有可能乱序执行)
      • 函数式程序并不描述”如何求值以得到结果”,而是描述”结果应当是什么样的”。函数式编程中,如何安排求值顺序相对自由
      • 引用透明性
        • 任何调用函数的地方,都可以用函数运行结果来替换函数调用,而不会产生副作用
      • 数据流式编程(dataflow programming)
        • (+ (+ 1 2) (+ 3 4))就是一个数据流,所有函数都可以用时执行
        • future模型
  • 分离标识与状态
    • 介绍
      • Clojure, 指令式编程和函数式编程混搭
    • clojure四种并发模型
      • vars (thread-local)
      • atoms原子变量
      • agent代理
      • refs引用 与 ATM软件事务内存
  • actor模型
    • 介绍
      • 作为actor自己修改自己的数据,对外提供消息,处理对外消息
      • 共享内存模型和分布式内存模型,适合解决地理分布型问题,强大的容错性
      • 基于消息传递,侧重通道两端实体
      • 每个actor有一个mailbox, mailbox中转消息
  • csp
    • 介绍
      • 通信顺序进程(communicating sequential processes)
      • 基于消息传递,侧重信息通道
  • 数据级并行
    • 不可变数据, 观测不可变、实现不可变
  • lambda架构
    • 介绍
      • 综合MapReduce和流式处理的特点,处理大数据问题的架构