探索C# : List 元素类型和清除方法
最近在多个线程中使用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 元素类型和清除方法相关推荐
- html div元素浮动,CSS实现元素浮动和清除浮动的方法
浮动基本介绍 在标准文档流中元素分为2种,块级元素和行内元素,如果想让一些元素既要有块级元素的特点也同时保留行内元素特点,只能让这些元素脱离标准文档流即可. 浮动可以让元素脱离标准文档流,可以实现让多 ...
- html去掉父元素样式,CSS清除浮动使父级元素展开的三个方法
一个没有设置高度的容器div内如果存在浮动元素(即使用了属性float:left或者float:right),那么该父级元素会无法展开. 为了使父级元素展开,有三种方法: 第一:设置父级元素的高度,但 ...
- python字符类型的一些方法
python 字符串和字节互转换.bytes(s, encoding = "utf8") str(b, encoding = "utf-8") i.isspac ...
- html笔记(二)html4+css2.0(元素类型、css精灵、宽度自适应、BFC、浏览器相关概述、css统筹)
大标题 小节 一.元素类型 1. 元素分类 2. 置换和非置换元素 3. 元素类型转换 二.css精灵 三.宽高自适应 1. 宽度自适应 2. 高度自适应 3. 最小高度自适应 4. 高度塌陷及解决办 ...
- 对于一个html元素,有几种方法修改样式方法的优先级,HTMLCSS常见面试题及疑难解答...
HTML&CSS常见面试题及疑难解答 HTML篇 对web标准以及W3C的理解与认识? WEB标准不是某一个标准,而是一系列标准的集合.网页主要由三部分组成:结构(Structure).表现( ...
- 《 Python List列表全实例详解系列(四)》__列表删除元素(4种方法)删除重复元素(去重)(8种方法)
< Python List列表全实例详解系列(四)> __列表删除元素(4种方法)删除重复元素(去重)(8种方法) 我的技术成长&学习资料整理分享之路 我遇到问题查找资料时,经常 ...
- javascript删除数组元素的几个方法
javascript删除数组元素的7个方法 文章目录 一.length属性 二.delete关键字 三.pop()栈方法 四.shift()队列方法 五.splice()操作方法 六.迭代方法 七.p ...
- c++ STL 常用容器元素类型相关限制 指针 引用
c++ 的 STL 中主要有 vector , list, map, set , multimap,multiset 这些容器完全支持使用内置类型和指针(指针注意内存泄露问题). 就是说乱用智能指针 ...
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...
最新文章
- WPF中获取鼠标相对于屏幕的位置
- 敲代码就是一把梭_2020必看!开发五年的大佬日常工作中所使用的java代码技巧...
- 关于wordpress 点击文章查看内容跳转加载失败(404)的解决方法
- python(5)- 基础数据类型
- Hyperledger Fabric区块链工具configtxgen配置configtx.yaml
- 大拐点!16省,人口开始负增长了
- C 语言 边读 边写入文件
- 【2】二级C语言中那些易错的概念题
- 蓝桥杯 基础练习 阶乘计算
- 三 .数据库(表操作)
- rmarkdown+flexdashboard制作dashboard原型
- 令牌环网概念_令牌环网工作原理_令牌环网为什么没人用
- iis7.5 php isapi映射,IIS7、iis7.5让ISAPI扩展DLL执行的方法
- 读后感----我奋斗了18年还是不能和你坐在一起喝咖啡
- css 解决因为书名号不满一行就换行情况
- hdu 4826 Labyrinth【DP】
- 华为ENSP(VRP)命令行
- android 屏幕亮度声音调节,Android 使用SeekBar 变更屏幕亮度和声音音量
- 3Dmax 常用-概念理解
- Unity开发HTC vive 五、拾取和触碰