互斥

同一时刻只有一个线程执行 称之为 互斥

保证原子性

对共享变量的修改是互斥的, 那么无论是单核 CPU 还是多核 CPU, 都能保证原子性.

锁和受保护资源的关系

受保护资源和锁之间的关联关系是 N:1 的关系.(即可以用同一把锁锁多个资源, 但是不能用多把锁锁同一个资源.)

死锁

死锁的四个条件

  1. 互斥, 共享资源 x 和 y 只能被一个线程占用
  2. 占有且等待, 线程 T1 已经取得共享资源 X, 在等待共享资源 Y 的时候, 不释放共享资源 X;
  3. 不可抢占, 其他线程不能强行抢占线程 T1 占用的资源;
  4. 循环等待, 线程 T1 等待线程 T2 占用的资源, 线程 T2 等待线程 T1 占用的资源.

针对上面的条件破坏死锁

  1. 针对”互斥”, 必然要求
  2. 针对”占用且等待”, 一次性申请所有的资源
  3. 针对”不可抢占”, 占用部分资源的线程如果申请不到其他资源, 主动释放已经申请的资源
  4. 针对”循环等待”, 让资源按序申请.

用”等待-通知”机制优化循环等待

wait() - notify() - notifyAll()