Java 并发编程理论基础 2 互斥锁
互斥
同一时刻只有一个线程执行 称之为 互斥
保证原子性
对共享变量的修改是互斥的, 那么无论是单核 CPU 还是多核 CPU, 都能保证原子性.
锁和受保护资源的关系
受保护资源和锁之间的关联关系是 N:1 的关系.(即可以用同一把锁锁多个资源, 但是不能用多把锁锁同一个资源.)
死锁
死锁的四个条件
- 互斥, 共享资源 x 和 y 只能被一个线程占用
- 占有且等待, 线程 T1 已经取得共享资源 X, 在等待共享资源 Y 的时候, 不释放共享资源 X;
- 不可抢占, 其他线程不能强行抢占线程 T1 占用的资源;
- 循环等待, 线程 T1 等待线程 T2 占用的资源, 线程 T2 等待线程 T1 占用的资源.
针对上面的条件破坏死锁
- 针对”互斥”, 必然要求
- 针对”占用且等待”, 一次性申请所有的资源
- 针对”不可抢占”, 占用部分资源的线程如果申请不到其他资源, 主动释放已经申请的资源
- 针对”循环等待”, 让资源按序申请.
用”等待-通知”机制优化循环等待
wait() - notify() - notifyAll()