c#安全队列和安全堆栈为什么实现不同?

jason成都 2018-10-29 10:23:30
最近为了实现一个集合,去了解了下安全集合,我一直以为ConcurrentStack和ConcurrentQueue应该内部差不多,因为他们功能差别不大。但是现在发现一个是数组,一个是链表,为啥会选择2类不同的结构来实现呢?是什么场景问题吗?
...全文
481 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
jason成都 2018-11-04
  • 打赏
  • 举报
回复
拿出来和大家讨论一下,一通百通,希望多和大家讨论。
jason成都 2018-11-04
  • 打赏
  • 举报
回复
顺便问一下,有没有c#版本本地缓存组件,能够直接嵌入程序中的那种dll
~高飞 2018-11-04
  • 打赏
  • 举报
回复
刚开始学,来逛一波
richardflb 2018-11-03
  • 打赏
  • 举报
回复
都是按顺序存储吧。一个是后进先出,一个是先进先出,两个有本质区别的数据结构。
  • 打赏
  • 举报
回复
引用 26 楼 jinyuttt 的回复:
可能是我没有描述清楚,我描述的只是一种假设的应用场景,只需要去实现那个桶结构,不需要实现那个10分钟的玩意,那个是业务部分,如果加上的话那就真是cache了。我不需要CACHE,只是一个桶结构(类似stack)存储数据,主要从顶部访问(存数据,取数据),必要时(很少)才从底部访问。
如果实际功能需求很少,那么其实 ConcurrentStack 这类设计也可以看作是个人爱好个人体验问题。实际上使用List<> 并且从尾部添加删除单元即可。
xiaoxiangqing 2018-11-02
  • 打赏
  • 举报
回复
功能不一样,所以实现方法也不一样
jason成都 2018-11-02
  • 打赏
  • 举报
回复
这几天测试研究了下,重写感觉还是麻烦多,而且不可靠。我采用linkedlist链表,加上Monitor同步,效率还是能够达到。毕竟是动态平衡,临时成批量增长完全可以。底部操作只是一段时间,效率够了。
liulilittle 2018-11-01
  • 打赏
  • 举报
回复
引用 23 楼 liulilittle 的回复:
内存移动、释放、碎片损耗问题,Stack 利用链表是最佳选择,Queue 则列表 --------------- 只要记住两者最核心的区别,那就明白为什么会这么选择了。 Stack 先进先出,Queue 先进后出 你看这句话一出,你仔细想一想看,是不是更能加能够理解呢? 当然还有最高速的固定栈,这个访问数组的效率一致非常非常快【非链表】, 但是C#受限于语法的一些特性,这块并不好利用它们(但不代表无法利用)。
sorry,“stack先进后出,queue先进先出”。 nn的一不注意就糟了,差点打脸
liulilittle 2018-11-01
  • 打赏
  • 举报
回复
内存移动、释放、碎片损耗问题,Stack 利用链表是最佳选择,Queue 则列表 --------------- 只要记住两者最核心的区别,那就明白为什么会这么选择了。 Stack 先进先出,Queue 先进后出 你看这句话一出,你仔细想一想看,是不是更能加能够理解呢? 当然还有最高速的固定栈,这个访问数组的效率一致非常非常快【非链表】, 但是C#受限于语法的一些特性,这块并不好利用它们(但不代表无法利用)。
xuzuning 2018-11-01
  • 打赏
  • 举报
回复
你要的就是一个 List<object>
什么都可以放进去,既可以从头存取,也可以从尾存取,甚至从中间任意处存取
jason成都 2018-11-01
  • 打赏
  • 举报
回复
引用 22 楼 sp1234 的回复:
你应该好好看看 Cache 的源代码。要设计一个Cache需要设计好 CacheDependency 机制,而你只知道一个最简单的 Duration 概念,那么你纠结的数据结构,也就只是半途而废。


可能是我没有描述清楚,我描述的只是一种假设的应用场景,只需要去实现那个桶结构,不需要实现那个10分钟的玩意,那个是业务部分,如果加上的话那就真是cache了。我不需要CACHE,只是一个桶结构(类似stack)存储数据,主要从顶部访问(存数据,取数据),必要时(很少)才从底部访问。
niannianyouyu123 2018-11-01
  • 打赏
  • 举报
回复
技术很重要,,,
sp1234_maJia 2018-10-31
  • 打赏
  • 举报
回复
ConcurrentStack 兼容了数组和链表,它把小数组用链表连起来,避免一次分配大数组。
  • 打赏
  • 举报
回复
ConcurrentStack 似乎是很在乎节省空间,它刻意从链表头部插入和删除对象,似乎 ConcurrentStack 对象生存期很长。而 ConcurrentQueue 看上去都是一些很小的队列,生存期很短,不怎么释放多余空间。
  • 打赏
  • 举报
回复
刚看了一下,ConcurrentStack 是链表实现而 ConcurrentQueue 使用数组实现,这或许是假设 ConcurrentQueue 非常小而 ConcurrentStack 经常用于很大的队列。
xuzuning 2018-10-31
  • 打赏
  • 举报
回复
C# 根本就没有打算公开 Segment
因为他更像 C++ 风格,而非 C#,都封装好了,使用队列也并无知道 Segment 的必要
  • 打赏
  • 举报
回复
你应该好好看看 Cache 的源代码。要设计一个Cache需要设计好 CacheDependency 机制,而你只知道一个最简单的 Duration 概念,那么你纠结的数据结构,也就只是半途而废。
jason成都 2018-10-31
  • 打赏
  • 举报
回复
我描述一下我打算实现的一个原理。举个例子。假如我是一个缓存,在某一时刻达到了100个buffer.但是100个只是一小段时间。大部分是80,那么有20个是空余。我设置一个时间长度,比如10分钟。判断buffer10分钟没有使用,我就把它释放了。怎么判断呢?我想的是一个桶结构,用bufffer都是从顶上取出,那么顶上的80个就会循环用,底部的20个就用不到,就好判断。本身是stack整好合适,但是它没法直接访问底部数据,所以得直接构造一个。最好还是原子同步,所以就想用什么基本结构存放数据,能够达到这样一个效果。对于结构使用这样就意味可以一种动态平衡了。这是我最近一直打算实现的。或者大家有没有已经实现的,我参考或者直接用。
  • 打赏
  • 举报
回复
concurrentstack 中链表中的数组段很小,只有32个单元。基本上可以看作是它仍然是链表,然后这里使用到数组其实是为了稍微优化一下。
wanghui0380 2018-10-31
  • 打赏
  • 举报
回复
在net4.5前我们的代码里很少考虑IO复用,所以这也是现在很多人的学习资料里和参考资料的没有特别说明的东西 除了XX园很少的几个介绍文章和老外的基本C#改进建议以外,你很难看到Segment,SegmentArray<T>,但是在Net4.5以后的版本中,微软在很多“IO优先”的类里都大规模使用了IO复用技术,比如MemoryStream,Tcpclient这类高IO的对象里都新增了SegmentArray支持 当然原因很简单,性能上他要减少IO分配,使用上我们也得减少IO分配避免内存一直涨,GC整天忙着处理“整理小的临时内存碎片”,而大内存对象找不到最够大的连续空间,而报内存不足的问题 只不过这种东西和微软以前的策略一样,他有归有,他从来不大规模宣传,你知道就知道,不知道拉倒! 话说微软一直就这模样,昨天查资料不经意扫到,微软体系的hadoop那个HDInsight,其实是有可以脱离azure的独立server版的,所以实际上你可以在net体系里,在脱离azure的私有体系里直接使用hadoop的全栈功能,但是微软宣传了么!还是那个德行,你知道你就用,不知道拉倒
加载更多回复(14)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧