昨天刚复习了多线程,来尝试详细地解释一下~
多线程编程中实现同步的基本机制是锁(lock)和条件(condition)。锁可以保证共享资源不会被多个线程同时访问,使用条件(condition)可以在不满足某种限制时释放掉线程所占有的锁并进入该条件(condition)的等待队列,以下是使用锁和条件的常用结构:
- Lock lock = ... // 声明一个 Lock 对象
- Condition cond = lock.newCondition(); // 获取该 Lock 对象的一个条件
- lock.lock(); // 获取锁
- try {
- // 判断是否满足某个限制,例如账户金额是否充足
- while (!someCondition) {
- // 如不满足限制,释放锁并进入条件的等待队列
- cond.await();
- }
- ...
- // 唤醒该条件等待队列中的线程
- cond.signalAll();
- } finally {
-
- // 释放锁
- lock.unlock();
- }
复制代码
当使用 Synchronized 关键字进行同步管理时,也是相同的原理,只不过此时不用显示声明锁和条件,而是自动地使用对象的固有锁和对应的条件。因此可以如下理解 Synchronized 关键字:
- public synchronized void method() {
- ...
- while (!someCondition) {
- wait();
- }
- ...
- notifyAll();
- }
- 等价于
- // 这里的 this.intrinsicLock 和 intrinsicCondition 代表该对象的固有锁和与该锁相关联的条件
- public void method() {
- this.intrinsicLock.lock();
- try {
- ...
- while (!someCondition) {
- intrinsicCondition.await();
- }
- ...
- intrinsicCondition.signalAll();
- } finally {
- this.intrinsicLock.unlock();
- }
- }
复制代码
|