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的主要内容,如果未能解决你的问题,请参考以下文章