首页 > 其他分享 >Condition 接口

Condition 接口

时间:2022-11-26 17:48:32浏览次数:39  
标签:lock Object 接口 线程 items 等待 Condition

Condition 接口

​ Condition将 Object 监视方法(wait、notify和notifyAll)分解为不同的对象,通过将它们与任意Lock实现的使用结合起来,实现每个对象具有多个等待集的效果。当Lock取代 synchronized 方法和语句的使用时,Condition取代对象监视方法的使用。

​ Conditions(也称为条件队列或条件变量)为一个线程提供了一种暂停执行(“等待”)的方法,直到另一个线程通知某个状态条件现在可能为 真。由于对共享状态信息的访问发生在不同的线程中,因此必须对其进行保护,因此某种形式的锁与条件相关联。等待条件提供的关键属性是它原子地释放相关的锁并挂起当前线程,就像Object.wait一样。

​ Condition实例本质上绑定到一个锁。要获取特定Lock实例的Condition实例,请使用它的newCondition()方法。

​ 举个例子,假设我们有一个支持put和take方法的有界缓冲区。如果在一个空缓冲区上尝试了一个取,那么线程将阻塞,直到有一个项可用;如果在一个满缓冲区上试图执行put操作,那么线程将阻塞,直到有可用的空间。我们希望在单独的等待集中保持等待put线程和take线程,以便在缓冲区中有项或空间可用时,我们可以使用只通知单个线程的优化方法。这可以通过使用两个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接口

​package java.util.concurrent.locks;
import java.util.concurrent.TimeUnit;
import java.util.Date;

/**
 *  Condition实例本质上绑定到一个锁。要获取特定Lock实例的Condition实例,请使用它的newCondition()方法。
 */
public interface Condition {
  /**
   * 导致当前线程等待,直到收到信号或被中断。
   */
  void await() throws InterruptedException;

  /**
   * 导致当前线程等待,直到收到信号。
   */
  void awaitUninterruptibly();
  
  /**
   * 导致当前线程等待,直到发出信号或中断,或指定的等待时间结束。
   */
  long awaitNanos(long nanosTimeout) throws InterruptedException;

  /**
   * 导致当前线程等待,直到发出信号或中断,或指定的等待时间结束。
   */
  boolean await(long time, TimeUnit unit) throws InterruptedException;

  /**
   * 导致当前线程等待,直到收到信号或中断,或超过指定的截止日期。
   */
  boolean awaitUntil(Date deadline) throws InterruptedException;

  /**
   * 唤醒一个等待的线程。
   */
  void signal();

  /**
   * 唤醒所有等待的线程。
   */
  void signalAll();
}

标签:lock,Object,接口,线程,items,等待,Condition
From: https://www.cnblogs.com/coolyang/p/16927861.html

相关文章

  • 快递停发区域查询接口
    通过寄件信息、收件信息,查询快递公司该线路是否支持寄送,减少退回、发货失败等情况,提升用户体验,减少物流成本。请求地址 GET​​https://api.itapi.cn/api/kuaidi/stop​​......
  • Pytest接口测试框架实战项目搭建(五)—— Streamlit首次应用
    一、源码,c_page.py'''@Date:2022/11/1414:36@Author:一加一'''importstreamlitasstimportosimportsysBASE_DIR=os.path.dirname(os.path.dirname(os.pa......
  • 【Spring Cloud实战】OpenFeign服务接口调用
    gitee地址:https://gitee.com/javaxiaobear/spring-cloud_study.git在线阅读地址:https://javaxiaobear.gitee.io/1、概述官网:https://docs.spring.io/spring-cloud-openfeig......
  • 【Java】EasyCaptcha 封装验证码接口
     依赖坐标:<dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId><version>1.6.2......
  • 关于查询接口设计
    此篇博客记录自己在设计模糊查询接口时候犯的错误,以及个人的一些浅略的思考,再次说明此并非最优设计。前言此模糊查询是项目的一个小接口,大致功能如下图所示。产品的......
  • 函数式接口的案例详解
    ​ 1.无参无返回值方法的函数式接口1.1自定义类实现接口的方式 1.2匿名内部类的方式 1.3lambda表达式的方式​ 2.有参无返回值方法的函数式接口......
  • mt7688 接口网卡接口说明
    硬件平台:mt7688软件平台:原生sdkMediaTek_ApSoC_SDK_4300_201409161.使用 ifconfig-a 命令可以列出mt7688上面所有的逻辑网卡接口,常见接口如下:apcli0:Thewirelessa......
  • 使用Spring Security对接口实现访问权限
     1<!--加入security依赖-->2<dependency>3<groupId>org.springframework.boot</groupId>4<artifactId>spring-boot-......
  • java 接口限制访问次数
    1.通过注解的形式实现通用接口访问次数限制(1)pom.xml文件中引入expiringmap<dependency><groupId>net.jodah</groupId><artifactId>expiringmap</artifa......
  • Lock接口
    packagecom.google;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;classDemo{privateinti=100;Lock......