Lock

Posted 竹马今安在

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lock相关的知识,希望对你有一定的参考价值。

1.ReentrantLock类

1.使用ReentrantLock类也可以实现使用synchroized的互斥效果,并且使用起来有很多地方更灵活。

用法如下

class MyService{
//建立锁对象
  private Lock lock=new ReentrantLock();
  public void num(){
  //加锁
      lock.lock();
    for(int i=0;i<10;i++){
     System.out.println(i):
   }
// 释放锁
   lock.unlock();
   }


}

使用ReentrantLock在基本的功能上和synchroized一样,调用lock.lock(),就像获得了一个“对象监视器”,直到它lock.unlock()以后,其他线程才能获得执行权。

2.那么使用lock以后,怎么进行线程间通信呢?

关键字synchronized与wait()和notify()/notifyall()搭配使用可以实现等待/通知。

使用ReentrantLock也可以实现,但必须借助Condition。一个lock可以创建多个Condition对象。Condition下面有await和signal和signalAl方法与wait()和notify()/notifyall(),怎么用呢?

class MyService{
//建立锁对象
  private Lock lock=new ReentrantLock();
//创建Condition对象.
  private Condition c=lock.newCondition();
  public void awaitOne(){
  //加锁
      lock.lock();
     System.out.println(A):
     c.await();
      System.out.println(B):
// 释放锁
   lock.unlock();
   }
  public void signalOne(){
  //加锁
      lock.lock();
     c.signal();
// 释放锁
   lock.unlock();
   }


}

需要注意:一定要在lock.lock()之后才可以await(),因为要首先获得监视器对象。

 

以上是关于Lock的主要内容,如果未能解决你的问题,请参考以下文章

线程基础四 使用Monitor类锁定资源

Java多线程与并发库高级应用-工具类介绍

ReentrantReadWriteLock场景应用

并发技术12线程锁技术的使用

java并发线程锁技术的使用

Java多线程与并发库高级应用-工具类介绍