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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗广伟 中级黑马   /  2013-6-9 19:08  /  1394 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗广伟 于 2013-6-10 07:57 编辑
  1. class Resource
  2. {
  3.         private String name;
  4.         private int count = 1;
  5.         private boolean flag = false;
  6.                         //  t1    t2
  7.         private Lock lock = new ReentrantLock();

  8.         private Condition condition_pro = lock.newCondition();//¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
  9.         private Condition condition_con = lock.newCondition();



  10.         public  void set(String name)throws InterruptedException
  11.         {
  12.                 lock.lock();
  13.                 try
  14.                 {
  15.                         while(flag)
  16.                                 condition_pro.await();//t1,t2
  17.                         this.name = name+"--"+count++;

  18.                         System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
  19.                         flag = true;
  20.                         condition_con.signal();
  21.                 }
  22.                 finally
  23.                 {
  24.                         lock.unlock();//释放锁的动作一定要执行。
  25.                 }
  26.         }


  27.         //  t3   t4  
  28.         public  void out()throws InterruptedException
  29.         {
  30.                 lock.lock();
  31.                 try
  32.                 {
  33.                         while(!flag)
  34.                                 condition_con.await();
  35.                         System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);
  36.                         flag = false;
  37.                         condition_pro.signal();
  38.                 }
  39.                 finally
  40.                 {
  41.                         lock.unlock();
  42.                 }
  43.                
  44.         }
  45. }
复制代码
问题位置:12天06视频中,在上述代码写着¥¥¥的那行。问题:既然lock是接口那么他的方法应该都是抽象方法,那为什么调用lock.newCondition()可以使用呢。

评分

参与人数 1技术分 +1 收起 理由
黑马伍哲沂 + 1 神马都是浮云

查看全部评分

6 个回复

倒序浏览
请注意你标明的那句话上面还有一句:
private Lock lock = new ReentrantLock();

所以你所指的lock并不是接口Lock,而是一个指向子类对象的引用,也就是多态,是已经被实现的对象,当然可以直接用。

以下是API中的内容:
java.util.concurrent.locks
接口 Lock

所有已知实现类:
ReentrantLock, ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock

Condition        newCondition()  返回绑定到此 Lock 实例的新 Condition 实例。

评分

参与人数 1技术分 +1 收起 理由
黑马伍哲沂 + 1 很给力!

查看全部评分

回复 使用道具 举报
Lock确实是接口,所以创建对象用的是实现了这个接口的类啊,不是用Lock直接创建对象。
Lock lock = new ReentrantLock();//这里虽然lock是接口的引用,但是在调用方法时,使用的是ReentrantLock()中的方法,这就是多态的应用。
你从API文档中可以找到LOCK接口下有这个类。

评分

参与人数 1技术分 +1 收起 理由
黑马伍哲沂 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
你创建的同步锁是Lock实现类ReentrantLock的对象。并不是Lock接口的对象,这里用到的是多态,接口引用指向子类对象;
在Java 5开始就有提供了同步锁这个更加强大的线程同步机制;他通过显示定义同步锁对象来实现同步,所以他比起用synchronined
方法或代码块更加灵活,并且支持Condition对象。
在Java1.5同步机制新特性中。有些是允许对共享资源的并发访问的,如ReadWriteLock,他有一个ReentrantReadWriteLock;
在Lock常用的实现类是ReentrantLock;
回复 使用道具 举报
罗广伟 来自手机 中级黑马 2013-6-10 07:58:28
报纸
小冰块 发表于 2013-6-9 19:32
请注意你标明的那句话上面还有一句:
private Lock lock = new ReentrantLock();


多谢,多谢
回复 使用道具 举报
罗广伟 来自手机 中级黑马 2013-6-10 07:59:53
地板
郑锐 发表于 2013-6-9 21:06
Lock确实是接口,所以创建对象用的是实现了这个接口的类啊,不是用Lock直接创建对象。
Lock lock = new Ree ...

明白了,多谢
回复 使用道具 举报
罗广伟 来自手机 中级黑马 2013-6-10 08:01:21
7#
曾林魁 发表于 2013-6-10 07:47
你创建的同步锁是Lock实现类ReentrantLock的对象。并不是Lock接口的对象,这里用到的是多态,接口引用指向 ...

非常感谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马