黑马程序员技术交流社区

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

作者: 黑马连家华    时间: 2012-3-26 16:53
标题: 5.0中的锁
本帖最后由 Noword 于 2012-3-26 16:57 编辑

private Lock lock = new ReentrantLock();
private Condition con = lock.new Condition();

...上面两句都什么意思啊...每一句都看不懂..表笑我.人笨没办法...多听多学多问就能会
上两句又有什么联系呢..
con.await();

作者: 贠(yun)靖    时间: 2012-3-26 17:16
private Lock lock = new ReentrantLock();
       Lock是一个借口  ReentrantLock  是实现Lock的接口的类       相当于用父类引用创建了一个子类对象   
private Condition con = lock.new Condition();
     而  newCondition() 是ReentrantLock 类中的一个方法   返回用来与此 Lock 实例一起使用的 Condition 实例对象
     这样lock锁 就色condition中的  await  signal等方法练习起来了  
    比如Synchronized 的锁是 Object的  而wait notify  相当于都要属于object这个锁得方法  才能使得方法和锁之间建立联系
  而lock中   只不过把这些抽象的东西显示出来了而已
作者: 黑马连家华    时间: 2012-3-26 17:26
贠(yun)靖 发表于 2012-3-26 17:16
private Lock lock = new ReentrantLock();
       Lock是一个借口  ReentrantLock  是实现Lock的接口的类  ...

好像...懂一点儿了~
作者: 李晓旭    时间: 2012-3-26 17:27
本帖最后由 李晓旭 于 2012-3-26 17:28 编辑

private Lock lock = new ReentrantLock();
创建一个Lock接口的的子类实现对象
Lock 是一个接口,ReentrantLock是Lock接口的一个实现类
ReentrantLocks是一个互斥锁,我觉得就是把同步代码块synchronized(Object){ ...... }用对象来划分了
所以想要创建一个关于Lock的对象就要创建Lock实现的子类对象,也算是一种多态形式.

private Condition con = lock.new Condition();
这个是配合Lock接口使用的条件,相当于不同的Object监视器可以分别使用(wait,notify,notifyAll)
其实就是相当于,Condition代替了同步代码块中的Object锁
不同的锁互不影响,并且可以分别控制


作者: yangshang1    时间: 2012-3-26 17:53
class BoundedBuffer {
   final Lock lock = new ReentrantLock();
   final Condition notFull  = lock.newCondition();
   final Condition notEmpty = lock.newCondition();

   final Object[] items = new Object[100];
   int putptr, takeptr, count;

   public void put(Object x) throws InterruptedException {
     lock.lock();
     try {
       while (count == items.length)
         notFull.await();
       items[putptr] = x;
       if (++putptr == items.length) putptr = 0;
       ++count;
       notEmpty.signal();
     } finally {
       lock.unlock();
     }
   }

   public Object take() throws InterruptedException {
     lock.lock();
     try {
       while (count == 0)
         notEmpty.await();
       Object x = items[takeptr];
       if (++takeptr == items.length) takeptr = 0;
       --count;
       notFull.signal();
       return x;
     } finally {
       lock.unlock();
     }
   }
}

作者: 庞子华    时间: 2012-3-26 20:06
有这种好事啊!!!
作者: 庞子华    时间: 2012-3-26 20:06
金钱啊!
作者: 黑马连家华    时间: 2012-3-27 18:08
庞子华 发表于 2012-3-26 20:06
金钱啊!

..................................................




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