当前位置: 首页 > news >正文

博优云软件官方网站网站建设策划完整方案

博优云软件官方网站,网站建设策划完整方案,珠宝店网站项目网页设计,学生如何自己做网站文章目录 1 PriorityBlockingQueue是什么2 核心属性详解3 核心方法详解3.1 offer(E e)3.2 poll()3.3 take()3.4 peek() 4 总结 1 PriorityBlockingQueue是什么 PriorityBlockingQueue类上的注释描述#xff1a;一个无界阻塞队列#xff0c;它使用与类PriorityQueue相同的排序… 文章目录 1 PriorityBlockingQueue是什么2 核心属性详解3 核心方法详解3.1 offer(E e)3.2 poll()3.3 take()3.4 peek() 4 总结 1 PriorityBlockingQueue是什么 PriorityBlockingQueue类上的注释描述一个无界阻塞队列它使用与类PriorityQueue相同的排序规则并提供阻塞检索操作。 PriorityQueue又是什么基于优先级的 堆 的无限制优先级队列PriorityQueue是一个小顶堆。 2 核心属性详解 利用数组实现小顶堆利用ReentrantLock 保证元素插入和移除的线程安全。同时因为是无界队列所以需要扩容机制此时引入遍历allocationSpinLock 对他unsafe的cas操作表示谁去扩容。 //元素存放的集合容器堆结构也是个数组所以需要数组集合private transient Object[] queue;//元素的数量private transient int size;//指定的元素的比较规则private transient Comparator? super E comparator;//保证线程安全的锁private final ReentrantLock lock;//当获取元素的线程因为集合中无元素而阻塞会使用该等待条件去实现private final Condition notEmpty;/*** 扩容时候使用的cas锁因为扩容要保证线程安全数组扩容是要new一个新数组的*/private transient volatile int allocationSpinLock;//序列化和反序列化使用的private PriorityQueueE q;3 核心方法详解 3.1 offer(E e) put操作一样因为无界队列所以没有存在容量满了阻塞等待获取元素的线程唤醒 整体逻辑就是元素放入堆中如果容量不够就进行扩容ReentrantLock 保证了这些操作是线程安全的 public boolean offer(E e) {if (e null)throw new NullPointerException();//获取锁final ReentrantLock lock this.lock;lock.lock();int n, cap;Object[] array;//如果当前元素数量已经达到了数组的长度上限则需要扩容while ((n size) (cap (array queue).length))//对当前数组进行扩容 扩容代码下面有解释tryGrow(array, cap);try {Comparator? super E cmp comparator;// 如果没指定比较器就代表你的类实现了Comparable接口if (cmp null)//添加元素到堆里 堆排序算法siftUpComparable(n, e, array);else//使用指定的比较器进行入堆siftUpUsingComparator(n, e, array, cmp);size n 1;notEmpty.signal();} finally {lock.unlock();}return true;}//扩容代码描述private void tryGrow(Object[] array, int oldCap) {//先释放锁因为当前线程需要干扩容的活不需要阻塞别的线程这样可能别的线程执行到这扩容已经好了//就可以执行if (newArray ! null queue array) ture成立的条件了lock.unlock();Object[] newArray null;//通过扩容锁减小锁的粒度只有一个线程能去开辟新的数组if (allocationSpinLock 0 UNSAFE.compareAndSwapInt(this, allocationSpinLockOffset,0, 1)) {try {//当前数组长度小于64的时候长度加2否则长度翻倍int newCap oldCap ((oldCap 64) ?(oldCap 2) : // grow faster if small(oldCap 1));//长度到达上限抛异常 if (newCap - MAX_ARRAY_SIZE 0) {// possible overflow//MAX_ARRAY_SIZE 是int最大值减8 此时还能慢慢的加不过一般来说都会OOM了int minCap oldCap 1;if (minCap 0 || minCap MAX_ARRAY_SIZE)throw new OutOfMemoryError();newCap MAX_ARRAY_SIZE;}//if (newCap oldCap queue array)newArray new Object[newCap];} finally {allocationSpinLock 0;}}//此时可能线程没拿到扩容锁且newArray new Object[newCap];还没执行到if (newArray null)Thread.yield();//再次获取主锁lock.lock();//此时两种情况//1.到这newArray new Object[newCap];还没执行到此时newArray null,queue还没被替换所以该方法结束之后循环又回来了释放锁。。。再次争抢锁//2.newArray new Object[newCap];已执行此时因为获取的是主锁只有一个线程能执行底下的queue newArray;和数组copy操作//这样其他线程获取到锁之后就会往新的数组中添加元素了if (newArray ! null queue array) {queue newArray;System.arraycopy(array, 0, newArray, 0, oldCap);}}如果队列中数组元素特别多此时扩容一次需要的时间就会相对增加其他线程阻塞的时间就会边长。 3.2 poll() 获取一个元素。 public E poll() {//获取锁final ReentrantLock lock this.lock;lock.lock();try {//拿出堆顶元素 return dequeue();} finally {lock.unlock();}}private E dequeue() {//n是当前元素结合中左后一个元素int n size - 1;if (n 0)return null;else {Object[] array queue;//堆顶就是0下标E result (E) array[0];E x (E) array[n];array[n] null;//堆顶被取出此时把末尾元素拿上来去重新比较排序保证堆的完整性Comparator? super E cmp comparator;if (cmp null)siftDownComparable(0, x, array, n);elsesiftDownUsingComparator(0, x, array, n, cmp);size n;return result;}}3.3 take() 相对于poll 多了等待操作 public E take() throws InterruptedException {final ReentrantLock lock this.lock;lock.lockInterruptibly();E result;try {while ( (result dequeue()) null)//区别在这notEmpty.await();} finally {lock.unlock();}return result; }3.4 peek() 获取堆顶元素但不移除 public E peek() {//获取锁final ReentrantLock lock this.lock;lock.lock();try {//返回堆顶元素return (size 0) ? null : (E) queue[0];} finally {lock.unlock();}}4 总结 PriorityBlockingQueue是一个小顶堆的数据结构的类使用了ReentrantLock来保证线程安全。可以通过传入的比较器去自定义小顶堆的比较规则或者实现Comparable接口。
http://www.hkea.cn/news/14592851/

相关文章:

  • 哪个网站是专门做装修的wordpress 多图上传插件
  • 做网站服务器一年多少钱天津网站建设开发
  • 江阴网站建设哪家好网页制作教程素材
  • 江苏网站seo优化网站没制作好可以备案吗
  • 建设自己网站的流程wordpress图片链接插件
  • 用wp做网站备案网站开发如何
  • 一页网站wordpress quiz
  • 网站建设预算表北京公司可以在上海建网站吗
  • 网站模版 拓近期楼市最新消息
  • 求网站建设网站优化工作免费的云服务器哪家好
  • php做网站半成品网络科技有限公司网站
  • 免费网站推广o2o电子商务平台有哪些
  • 网站建设 主机选择asp网站部署 iis7
  • 石家庄招聘哪个网站做的好网站建设项目软件开发招标文件
  • 营销型网站有哪些手机软件下载大全
  • 公司网页网站建设+ppt模板下载沈阳做网站的公司有哪些
  • 网站asp文件只读手机商城网站建设
  • 做网站必须要公网ip有没有教做川菜的网站
  • 枣庄建网站的公司重庆宣传片2023
  • 怎么编辑网站源代码深圳营销型网站建设+宝安西乡
  • 做好中心网站建设工作总结室内设计家装设计
  • 常用的设计师网站男男做暧网站免费
  • 建设网站的网站江苏男生必备的浏览器
  • 网站建设怎样找客户交通行业门户网站建设的必要性
  • 网站上内容列表怎么做合肥响应式网站建设方案
  • 个人短信接口wordpress太原seo报价
  • 广州网站优化哪家快wordpress版本对应php版本
  • 个人免费展示网站网站 按钮 素材
  • 女的做公关到底是干嘛的北京seo网络优化师
  • 家居企业网站建设流程dw外部网站链接怎么做