黑马程序员技术交流社区

标题: 关于多线程lock接口方法的问题 [打印本页]

作者: 罗广伟    时间: 2013-6-9 19:08
标题: 关于多线程lock接口方法的问题
本帖最后由 罗广伟 于 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()可以使用呢。
作者: 小冰块    时间: 2013-6-9 19:32
请注意你标明的那句话上面还有一句:
private Lock lock = new ReentrantLock();

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

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

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

Condition        newCondition()  返回绑定到此 Lock 实例的新 Condition 实例。
作者: 郑锐    时间: 2013-6-9 21:06
Lock确实是接口,所以创建对象用的是实现了这个接口的类啊,不是用Lock直接创建对象。
Lock lock = new ReentrantLock();//这里虽然lock是接口的引用,但是在调用方法时,使用的是ReentrantLock()中的方法,这就是多态的应用。
你从API文档中可以找到LOCK接口下有这个类。
作者: 曾林魁    时间: 2013-6-10 07:47
你创建的同步锁是Lock实现类ReentrantLock的对象。并不是Lock接口的对象,这里用到的是多态,接口引用指向子类对象;
在Java 5开始就有提供了同步锁这个更加强大的线程同步机制;他通过显示定义同步锁对象来实现同步,所以他比起用synchronined
方法或代码块更加灵活,并且支持Condition对象。
在Java1.5同步机制新特性中。有些是允许对共享资源的并发访问的,如ReadWriteLock,他有一个ReentrantReadWriteLock;
在Lock常用的实现类是ReentrantLock;
作者: 罗广伟    时间: 2013-6-10 07:58
小冰块 发表于 2013-6-9 19:32
请注意你标明的那句话上面还有一句:
private Lock lock = new ReentrantLock();


多谢,多谢
作者: 罗广伟    时间: 2013-6-10 07:59
郑锐 发表于 2013-6-9 21:06
Lock确实是接口,所以创建对象用的是实现了这个接口的类啊,不是用Lock直接创建对象。
Lock lock = new Ree ...

明白了,多谢
作者: 罗广伟    时间: 2013-6-10 08:01
曾林魁 发表于 2013-6-10 07:47
你创建的同步锁是Lock实现类ReentrantLock的对象。并不是Lock接口的对象,这里用到的是多态,接口引用指向 ...

非常感谢




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