加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

锁的使用至关重要

发布时间:2021-05-26 23:27:07 所属栏目:语言 来源:互联网
导读:ReentrantLock 独占锁的实现,拥有上面列举的除读写锁之外的所有特性,使用比较简单 classX{ //创建独占锁实例 privatefinalReentrantLock lock = new Reentrant

Condition成为条件队列或条件变量,为一个线程挂起执行(等待)提供了一种方法,直到另一线程通知某些状态条件现在可能为真为止。由于对该共享状态信息的访问发生在不同的线程中,因此必须由互斥锁对其其进行保护。

await方法:必须在获取锁之后的调用,表示释放当前锁,阻塞当前线程;等待其他线程调用锁的signal或signalAll方法,线程唤醒重新获取锁。

Lock配合Condition,可以实现synchronized 与 对象(wait,notify)同样的效果,来进行线程间基于共享变量的通信。但优势在于同一个锁可以由多个条件队列,当某个条件满足时,只需要唤醒对应的条件队列即可,避免无效的竞争。

// 此类实现类似阻塞队列(ArrayBlockingQueue)  

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();  

   }  

 }  

BlockingQueue

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读