世界杯万博体育

下面开始PriorityBlockingQueue的源码分析,首先我们来看看构造方法://默认构造方法,采用默认值(11)来进行初始化publicPriorityBlockingQueue(){??this(DEFAULT_INITIAL_CAPACITY,null);}//指定数组的初始大小publicPriorityBlockingQueue(intinitialCapacity){??this(initialCapacity,null);}//指定比较器publicPriorityBlockingQueue(intinitialCapacity,???????????????Comparatorcomparator){??if(initialCapacity????thrownewIllegalArgumentException();??this.lock=newReentrantLock();??this.notEmpty=lock.newCondition();??this.comparator=comparator;??this.queue=newObject[initialCapacity];}//在构造方法中就先填充指定的集合中的元素publicPriorityBlockingQueue(Collectionc){??this.lock=newReentrantLock();??this.notEmpty=lock.newCondition();??//???booleanheapify=true;//trueifnotknowntobeinheaporder??booleanscreen=true;?//trueifmustscreenfornulls??if(cinstanceofSortedSet){????SortedSetss=(SortedSet)c;????this.comparator=(Comparator)ss.comparator();????heapify=false;??}??elseif(cinstanceofPriorityBlockingQueue){????PriorityBlockingQueuepq=??????(PriorityBlockingQueue)c;????this.comparator=(Comparator)pq.comparator();????screen=false;????if(pq.getClass()==PriorityBlockingQueue.class)//exactmatch??????heapify=false;??}??Object[]a=c.toArray();??intn=a.length;??//Ifc.toArrayincorrectlydoesn'treturnObject[],copyit.??if(a.getClass()!=Object[].class)????a=Arrays.copyOf(a,n,Object[].class);??if(screen&&(n==1||this.comparator!=null)){????for(inti=0;i??????if(a[i]==null)????????thrownewNullPointerException();??}??this.queue=a;??this.size=n;??if(heapify)????heapify();}接下来,我们来看看其内部的自动扩容实现:privatevoidtryGrow(Object[]array,intoldCap){??//这边做了释放锁的操作??lock.unlock();//mustreleaseandthenre-acquiremainlock??Object[]newArray=null;??//用CAS操作将allocationSpinLock由0变为1,也算是获取锁??if(allocationSpinLock==0&&????UNSAFE.compareAndSwapInt(this,allocationSpinLockOffset,?????????????????0,1)){????try{??????//如果节点个数小于64,那么增加的oldCap+2的容量??????//如果节点数大于等于64,那么增加oldCap的一半??????//所以节点数较小时,增长得快一些??????intnewCap=oldCap+((oldCap??????????????????(oldCap+2):??????????????????(oldCap>>1));??????//这里有可能溢出??????if(newCap-MAX_ARRAY_SIZE>0){??//possibleoverflow????????intminCap=oldCap+1;????????if(minCapMAX_ARRAY_SIZE)??????????thrownewOutOfMemoryError();????????newCap=MAX_ARRAY_SIZE;??????}??????//如果queue!=array,那么说明有其他线程给queue分配了其他的空间??????if(newCap>oldCap&&queue==array)????????//分配一个新的大数组????????newArray=newObject[newCap];????}finally{??????//重置,也就是释放锁??????allocationSpinLock=0;????}??}??//如果有其他的线程也在做扩容的操作??if(newArray==null)//backoffifanotherthreadisallocating????Thread.yield();??//重新获取锁??lock.lock();??//将原来数组中的元素复制到新分配的大数组中??if(newArray!=null&&queue==array){????queue=newArray;????System.arraycopy(array,0,newArray,0,oldCap);??}}扩容方法对并发的控制也非常的巧妙,释放了原来的独占锁lock,这样的话,扩容操作和读操作可以同时进行,提高吞吐量。这样,动态链接库虽然在不同进程中有不同的映射虚拟空间,但物理空间上共享。java中单例模式的写法也有好多种。出生于江西省上饶市一户普通农民家庭的陈波,是一个不安分的人。「Python开发者」是最受欢迎的、专注分享Python技术的微信公众号,主要分享Python开发相关资讯、技术文章、工具资源、热门教程和高薪职位等。

新闻公告news
工作安排/ work
新区校区第19周工作安排
发布时间:2019-06-24 08:07:12     作者:    来源:
  

版权所有 万博最新2018网址 陕ICP备11011081号 站长信箱lf2007818@163.com
万博最新2018网址欢迎光临本站,您是第 访问者!网站建设-艺源视网
地址:铜川市新区朝阳路10号 电话:0919—3589821 管理登录