SynchronousQueue 1.8源码解析

  (TOC)

  

SynchronousQueue 1.8源码解析

  
一、简介h5>   

SynchronousQueue是一个很奇怪的队列,感觉都不能叫队列,因为内部没有数据的存储空间,队列不能偷看,因为不存在元素,任何入队的线程都会阻塞,直到有线程来出队,也就是这个队列是一组操作,入队和出队要一起离开,出队也是一样,必须等入队,必须结伴而行;队列支持公平和非公平的模式(指的是队列匹配线程的顺序),公平模式的数据结构是队列(FIFO),非公平模式使用的是栈(LIFO)。

     
二、UML图
  

 SynchronousQueue 1.8源码解析

  
三,基本成员h5> <代码类="语言java ">抽象静态类Transferer{//出队入队都是这一个方法   文摘E转移(E E,布尔的,长nano);   }//转数   静态最终int NCPUS=Runtime.getRuntime () .availableProcessors ();//带超时时间的自旋次数   静态最终int maxTimedSpins=(NCPUS & lt;2)吗?0:32;//没有超时的自旋次数   静态最终int maxUntimedSpins=maxTimedSpins * 16;   <编辑> TransferStack非公平的实现,主要成员   

TransferStack继承转让者

  

注意:<强>这几个状态很重要,因为继承了转让者,所以出队和入队都是使用的转移方法,状态是用来区分的,后面方法部分会详解

  
 <代码类="语言java ">/* * 0表示消费者*/静态最终int请求=0;/* * 1表示数据的生产者*/静态最终int数据=https://www.yisu.com/zixun/1;/* * 2表示数据正在匹配*/静态最终int满足=2;
  
  静态最终类综述{
  挥发性综述下;//下一个节点
  挥发性综述匹配;//匹配的节点
  不稳定的线程服务员;//等待的线程
  对象项目;//数据
  int模式;//模式0,1,2
  }/* *头结点*/挥发性综述头; 
  <编辑> TransferQueue公平实现,主要成员   

TransferQueue继承转让者

  
 <代码类="语言java ">静态最终类QNode {
  挥发性QNode下;//下一节点
  不稳定对象项目;//数据项
  不稳定的线程服务员;//等待线程
  最后布尔isData;//区分生产和消费
  }/* *头结点*/瞬态波动QNode头;/* *尾节点*/瞬态波动QNode尾巴; 
  
四,常用方法
  <编辑>构造方法   
 <代码类="语言java ">公共SynchronousQueue () {
  这(假);
  }//构造方法、公平表示公平或者非公平
  公共SynchronousQueue(布尔公平){
  转让者=公平吗?新的TransferQueue():新的TransferStack ();
  } 
  <编辑> TransferStack非公平常用方法   提供方法   
 <代码类=" language-jav ">公共布尔提供(E E) {//e不能为null
  如果(e==null)把新NullPointerException ();
  转让者返回。转移(e,真的,0)!=零;
  }
  
  公共布尔提供(E E,长时间超时,TimeUnit单元)
  抛出InterruptedException {//e不能为null
  如果(e==null)把新NullPointerException ();
  如果(转让者。传输(e,真的,unit.toNanos(超时))!=null)
  返回true;
  如果(! Thread.interrupted ())
  返回错误;
  抛出InterruptedException ();
  } 
  把方法   
 <代码类="语言java ">公共空放(E E)抛出InterruptedException {//e不能为null
  如果(e==null)把新NullPointerException ();
  如果(转让者。转移(e,错误,0)==null) {//支持中断
  Thread.interrupted ();
  抛出InterruptedException ();
  
  } 
  调查方法   
 <代码类="语言java ">公共E调查(){
  转让者返回。转让(null,真的,0);
  } 
  把方法   
 <代码类="语言java ">公共E采取()抛出InterruptedException {
  E E=转让者。转让(null,假的,0);
  如果(e !=null)
  返回e;
  Thread.interrupted ();
  抛出InterruptedException ();
  } 
  转移方法   
 <代码类="语言java "> E转移(E E,布尔的,长nano) {
  
  综述s=零;//构建/重用//根据所传元素判断为生产或消费
  int模式=(e==null) ?要求:数据;
  
  (,){//无限循环
  综述h=头;//获取头结点
  如果(h==null | | h。模式==模式){//头结点为空或者当前节点状态(0,1,2)和头结点相同
  如果时间,,nano & lt;=0){//迫不及待设置有时间//节点不为零并且为取消状态
  如果(h !=零,,h.isCancelled ())//弹出取消的节点
  casHead (h, h.next);//流行取消节点
  其他的//超时直接返回零
  返回null;//没有设置超时
  }else if (casHead (h, s=综述(s、e、h模式))){//将h设为自己的下一节点//空旋或者阻塞直到年代结点被满足操作所匹配
  综述m=awaitFulfill(年代,定时,nano);
  如果(m==s){//等待被取消节点被取消了
  清洁(s);
  返回null;
  }//找到匹配的线程了//h==头可能已经已经被匹配//h。接下来等于年代不同类型
  如果(h=头!=零,,h。下一个==)//弹出h和s
  casHead (h, s.next);//帮助年代的履行
  返回(E)((模式==请求)?m。项目:s.item);
  }//未匹配
  }else if (! isFulfilling (h.mode)){//试图完成//尝试匹配节点
  如果(h.isCancelled())已经取消了////节点被取消
  casHead (h, h.next);//流行和重试//修改头结点
  else if (casHead (h, s=综述(s、e、h,充实|模式))){
  (,){//循环直到匹配或服务员消失
  综述m=s.next;//m s匹配//没有下一个节点了,结束这次循环,走最外层循环重新开始
  如果(m==null){//所有服务员都不见了//m等于空
  casHead(年代,null);//流行实现节点//cas设置的头
  s=零;//下次使用新节点
  打破;//重新启动主循环//结束循环
  }
  综述mn=m.next;
  如果(m.tryMatch (s)){//尝试匹配,成功
  casHead(年代,mn);//s和m流行
  返回(E)((模式==请求)?m。项目:s.item);
  }//其他失去比赛//失败,说明米背的线程匹配了,或者取消了
  年代。casNext (m, mn);//帮助分离//修改下一节点
  }
  }
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

SynchronousQueue 1.8源码解析