A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© treecolor166 中级黑马   /  2013-12-29 00:43  /  1897 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

同步函数的锁是this,调用lock.lock()方法获取到的锁是什么

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

3 个回复

正序浏览
昨天刚复习了多线程,来尝试详细地解释一下~

多线程编程中实现同步的基本机制是锁(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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

回复 使用道具 举报
lock()方法相当于synchronized代码块,其中监视器(就是锁)是newCondition() 方法返回的Condition 对象。
newCondition() 返回绑定到此 Lock 实例的新 Condition 实例。
回复 使用道具 举报
多线程操作的 同步代码快中,共享的对象 ;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马