zoukankan      html  css  js  c++  java
  • 源码解析-BlockingQueue的小解

     

     BlockingQueue 啊   阻塞队列  JUC下又一重要工具

    继承自传统队列Queue  拥有传统队列的属性,特点在于可以设置队列大小,如果队列满了再入队会阻塞,如果队列空了再出队会阻塞。

     BlockingQueue是不允许插入null元素的,会直接抛空指针异常。因为插入了null元素 获取元素时无法判断是插入成功还是失败

    下边表 是阻塞队列 重要常用方法  put(e)   take()   会阻塞

     实现BlockingQueue的操作大部分都是线程安全的,内部由一个ReentrantLock,两个Condition控制,实现了入队出队多线程安全及阻塞

    下面研究一下下最常用的ArrayBlockingQueue

    ArrayBlockingQueue常用于生产者消费者这种模式,支持多生产者 多消费者

    几个重要属性

     1.put()  

     获取锁

    上锁 被中断自动释放

    try{

      while(当队列满了){

       Condition notFull 等待;

      }

      入队操作

    }

    take()

    一样的味道 

    ArrayBlockingQueue源码没有复杂的地方,充分利用了ReentrantLock 和Condition原理 

     解释一下SynchronousQueue ,其实并没有存储结构  而是一种入队一个 就等待线程出队,如果线程A入队  没有其他线程出队 那么线程A一直阻塞等待

  • 相关阅读:
    1024:保留3位小数的浮点数
    1023:Hello,World!的大小
    1023:Hello,World!的大小
    1023:Hello,World!的大小
    1022:整型与布尔型的转换
    1022:整型与布尔型的转换
    1022:整型与布尔型的转换
    CMD删除指定文件夹
    CMD删除指定文件夹
    C#xml读取节点数据方法
  • 原文地址:https://www.cnblogs.com/ttaall/p/14012483.html
Copyright © 2011-2022 走看看