黑马程序员技术交流社区

标题: 线程中的锁 [打印本页]

作者: treecolor166    时间: 2013-12-29 00:43
标题: 线程中的锁
同步函数的锁是this,调用lock.lock()方法获取到的锁是什么
作者: 776699    时间: 2013-12-29 02:36
多线程操作的 同步代码快中,共享的对象 ;
作者: 胡永城    时间: 2013-12-29 03:14
lock()方法相当于synchronized代码块,其中监视器(就是锁)是newCondition() 方法返回的Condition 对象。
newCondition() 返回绑定到此 Lock 实例的新 Condition 实例。
作者: zzmxhm    时间: 2013-12-29 13:30
昨天刚复习了多线程,来尝试详细地解释一下~

多线程编程中实现同步的基本机制是锁(lock)和条件(condition)。锁可以保证共享资源不会被多个线程同时访问,使用条件(condition)可以在不满足某种限制时释放掉线程所占有的锁并进入该条件(condition)的等待队列,以下是使用锁和条件的常用结构:
  1. Lock lock = ...     // 声明一个 Lock 对象
  2. Condition cond = lock.newCondition();   // 获取该 Lock 对象的一个条件

  3. lock.lock();     // 获取锁
  4. try {

  5.     // 判断是否满足某个限制,例如账户金额是否充足
  6.     while (!someCondition) {
  7.         // 如不满足限制,释放锁并进入条件的等待队列
  8.         cond.await();
  9.     }
  10.     ...

  11.     // 唤醒该条件等待队列中的线程
  12.     cond.signalAll();
  13. } finally {
  14.    
  15.     // 释放锁
  16.     lock.unlock();
  17. }
复制代码


当使用 Synchronized 关键字进行同步管理时,也是相同的原理,只不过此时不用显示声明锁和条件,而是自动地使用对象的固有锁和对应的条件。因此可以如下理解 Synchronized 关键字:
  1. public synchronized void method() {
  2.     ...
  3.     while (!someCondition) {
  4.         wait();
  5.     }

  6.     ...
  7.     notifyAll();
  8. }

  9. 等价于

  10. // 这里的 this.intrinsicLock 和 intrinsicCondition 代表该对象的固有锁和与该锁相关联的条件
  11. public void method() {
  12.     this.intrinsicLock.lock();
  13.     try {
  14.         ...
  15.         while (!someCondition) {
  16.             intrinsicCondition.await();
  17.         }

  18.         ...
  19.         intrinsicCondition.signalAll();
  20.     } finally {
  21.         this.intrinsicLock.unlock();
  22.     }
  23. }
复制代码






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2