• Condition分析


      Condition中提供了一组类似于Object中的监视器方法。与Lock配合可以完成等待通知模式。

      

      Condition只能通过Lock#newCondition()方法获取,所以Condition是依赖于Lock的,而在调用这个方法之前,线程需要先获得锁,

      同时,在一个Lock中,可以获取多个Condition对象。

      主要方法

      void await() throws InterruptedException :使当前线程进入等待状态,知道被通知(signal/signalAll)或中断,当前线程从await()方法返回的情况包括:

        ·其他线程调用该condition的signal()或者signalAll()方法,而且当前线程被选中唤醒

        ·其他线程调用interrupt()方法中断当前线程

        ·如果当前线程从await()方法返回,那么表明该线程已经获取了Condition对象所对应的锁。

      void awaitUninterruptibly():当前线程进入等待状态直到被通知,但是不会相应中断。

      void awaitNanos(long nanosTimeOut) throws InterruptedException:当前线程进入等待状态知道被通知、中断或者超时。返回值表示剩余的时间,如果在nanosTimeout纳秒之前被唤醒,那么返回值就是nanosTimeout的实际耗时,如果返回值是0或则负数,那么可以认定已经超时了。

      boolean awaitUntil(Date deadline)throws InterruptedException:当前线程进入等待状态直到被通知、中断或者到某个时间。如果没有到指定时间就被通知,方法返回true,否则到了直到的时间,方法返回false。

      void signal():唤醒一个等待在Coindition上的线程,该线程从等待方法返回前必须获得与Condition相关联的锁。

      void signalAll():唤醒所有等待在Condition上的线程,能够从等待方法返回的线程必须获得与Condition相关联的锁。

      使用方式

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

      Condition是一个接口,在并发包中,主要的实现是AbstractQueuedSynchronizer中的内部类ConditionObject。

      ConditionObject的实现参考这里

      

  • 相关阅读:
    461.mysql数据的备份和恢复
    thinkcmf安装遇到的问题【服务器rewrite】未开启
    navicat for mysql 中文破解版(无需激活码)
    centos7--docker安装gitlab时权限异常
    Cenos7 ++Zabbix监控(同个节点)
    Centos-第一次机子遭受黑客入侵??很鸡冻
    Linux运维--企业sudo权限规划详解 (实测一个堆命令搞定)
    Centos7--sudo的使用和配置
    网络技术--IPv4子网掩码的理解和计算。
    CentOS7--部署JSP网站项目(环境架构jsp+mysql+tomcat)
  • 原文地址:https://www.cnblogs.com/zerotomax/p/8966975.html
Copyright © 2020-2023  润新知