标签:... 随笔 SynchronousQueue SNode 关于 put null take
最近用到了SynchronousQueue,也在网上查阅了相关资料,总感觉有些话说得让人费解,下面结合自己的理解总结下。
1、一个不存储元素的阻塞队列。这句话就让我困惑了,不存储元素,那元素保存到哪里了?通过阅读源码,以非公平模式为例:
...
casHead(h, s = snode(s, e, h, mode))
...
static SNode snode(SNode s, Object e, SNode next, int mode) {
if (s == null) s = new SNode(e);
s.mode = mode;
s.next = next;
return s;
}
...
Thread w = Thread.currentThread();
...
else if (s.waiter == null)
s.waiter = w;
实际上元素还是保存下来了(不考虑take操作,可以暂时理解为链表),而且把调用put方法的线程也保存了。通过调试也可看到SynchronousQueue对象信息:
说明:启用了线程 put-t1放入整型数据1和线程put-t2放入整型数据2,put-t1先执行。
2、SynchronousQueue吞吐量高于LinkedBlockingQueue和ArrayBlockingQueue。这种必然是有前提的,put(生产者)和take(消费者)效率一致。否则,生产者和消费者互相等待,吞吐量会手影响。
3、SynchronousQueue作为一个空集合,此队列不允许 null 元素。对于这句话我同样无法理解,为什么?看看源码,比较put和take操作:
put操作时,...transferer.transfer(e, false, 0)...;
take操作时,...E e = transferer.transfer(null, false, 0)...;
一下子就明白了,如果放入了null,表示这个节点对应的是take操作;放入非null表示这个节点对应的是put操作。
标签:...,随笔,SynchronousQueue,SNode,关于,put,null,take 来源: https://blog.csdn.net/a1257427517/article/details/118679945
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。