最近在多个线程中使用LIST集合作为数据交换容器, 类似于生产者消费者这样的模式。生产者使用List.Add() 方法增加元素,消费者使用List.RemoveAt(0)消费。咋一看,没什么问题。但程序越跑越大,虽然C#有垃圾回收机制,但是究其原因,实际是忽略了List.Add是值引用这个本质。另外, 我在这个例子中,使用Lock(o)来同步生产者消费者的行为是不可行的,原因很简单:Lock没有先后关系,谁有机会谁就获得了使用权。因而我用了Semaphore作为线程同步的媒介。

看代码吧。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;namespace ConsoleApplication3
{class Program{static Semaphore sm = new Semaphore(0, 5);static void Main(string[] args){List<string> list = new List<string>();Thread t = new Thread(new ParameterizedThreadStart(Add));t.Start(list);Thread t2 = new Thread(new ParameterizedThreadStart(Minus));t2.Start(list);t2.Join();Console.WriteLine("Length of List is {0}",list.Count);Console.Read();}static void Add(object o){List<string> list = o as List<string>;int i = 0;while (i<10000){string ss = string.Format("samplesample.{0}", i.ToString());list.Add(ss);sm.Release();Thread.Sleep(10); // 等10ms,这样不会超过semophore最大数量Console.WriteLine("ADD {0}", i++);}        }static void Minus(object o){List<string> list = o as List<string>;int i = 0;while (i < 10000){sm.WaitOne();list.RemoveAt(0);Console.WriteLine("Minus {0}", i++);}        }}
}

最后的输出是:

没加即时垃圾回收,最后程序消耗内存 (可见,List.RemoveAt 也不是真正的删除string变量开销。)

而加上即时垃圾回收(上代码RemoveAt(0)后面加上GC.Collect())

探索C# : List 元素类型和清除方法相关推荐

  1. html div元素浮动,CSS实现元素浮动和清除浮动的方法

    浮动基本介绍 在标准文档流中元素分为2种,块级元素和行内元素,如果想让一些元素既要有块级元素的特点也同时保留行内元素特点,只能让这些元素脱离标准文档流即可. 浮动可以让元素脱离标准文档流,可以实现让多 ...

  2. html去掉父元素样式,CSS清除浮动使父级元素展开的三个方法

    一个没有设置高度的容器div内如果存在浮动元素(即使用了属性float:left或者float:right),那么该父级元素会无法展开. 为了使父级元素展开,有三种方法: 第一:设置父级元素的高度,但 ...

  3. python字符类型的一些方法

    python 字符串和字节互转换.bytes(s, encoding = "utf8") str(b, encoding = "utf-8") i.isspac ...

  4. html笔记(二)html4+css2.0(元素类型、css精灵、宽度自适应、BFC、浏览器相关概述、css统筹)

    大标题 小节 一.元素类型 1. 元素分类 2. 置换和非置换元素 3. 元素类型转换 二.css精灵 三.宽高自适应 1. 宽度自适应 2. 高度自适应 3. 最小高度自适应 4. 高度塌陷及解决办 ...

  5. 对于一个html元素,有几种方法修改样式方法的优先级,HTMLCSS常见面试题及疑难解答...

    HTML&CSS常见面试题及疑难解答 HTML篇 对web标准以及W3C的理解与认识? WEB标准不是某一个标准,而是一系列标准的集合.网页主要由三部分组成:结构(Structure).表现( ...

  6. 《 Python List列表全实例详解系列(四)》__列表删除元素(4种方法)删除重复元素(去重)(8种方法)

    <  Python List列表全实例详解系列(四)> __列表删除元素(4种方法)删除重复元素(去重)(8种方法) 我的技术成长&学习资料整理分享之路 我遇到问题查找资料时,经常 ...

  7. javascript删除数组元素的几个方法

    javascript删除数组元素的7个方法 文章目录 一.length属性 二.delete关键字 三.pop()栈方法 四.shift()队列方法 五.splice()操作方法 六.迭代方法 七.p ...

  8. c++ STL 常用容器元素类型相关限制 指针 引用

    c++ 的 STL 中主要有 vector , list, map, set  , multimap,multiset 这些容器完全支持使用内置类型和指针(指针注意内存泄露问题). 就是说乱用智能指针 ...

  9. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

最新文章

  1. WPF中获取鼠标相对于屏幕的位置
  2. 敲代码就是一把梭_2020必看!开发五年的大佬日常工作中所使用的java代码技巧...
  3. 关于wordpress 点击文章查看内容跳转加载失败(404)的解决方法
  4. python(5)- 基础数据类型
  5. Hyperledger Fabric区块链工具configtxgen配置configtx.yaml
  6. 大拐点!16省,人口开始负增长了
  7. C 语言 边读 边写入文件
  8. 【2】二级C语言中那些易错的概念题
  9. 蓝桥杯 基础练习 阶乘计算
  10. 三 .数据库(表操作)
  11. rmarkdown+flexdashboard制作dashboard原型
  12. 令牌环网概念_令牌环网工作原理_令牌环网为什么没人用
  13. iis7.5 php isapi映射,IIS7、iis7.5让ISAPI扩展DLL执行的方法
  14. 读后感----我奋斗了18年还是不能和你坐在一起喝咖啡
  15. css 解决因为书名号不满一行就换行情况
  16. hdu 4826 Labyrinth【DP】
  17. 华为ENSP(VRP)命令行
  18. android 屏幕亮度声音调节,Android 使用SeekBar 变更屏幕亮度和声音音量
  19. 3Dmax 常用-概念理解
  20. Unity开发HTC vive 五、拾取和触碰

热门文章

  1. Docker常用工具
  2. Compose 类型稳定性注解:@Stable @Immutable
  3. 如何看待央行聚合支付的政策走向?
  4. 子豪兄-YOLOv3
  5. 个人深度学习keras环境配置介绍
  6. Unity基础 Unity获取当前时间的时间戳
  7. 如何导入后缀ndm的文件
  8. 简单的手机蓝牙遥控智能小车
  9. 基础IT技术学习资料300篇,欢迎一键收藏
  10. JavaScript Light BOX相册预览功能