C# 在多线程环境中,进行安全遍历操作

时间:2022-10-23 13:40:59

本文以List作为操作对象
MSDN官方给出的List的线程安全的说法:
此类型的公共静态成员是线程安全的。但不能保证任何实例成员是线程安全的。
只要不修改该集合,List 就可以同时支持多个阅读器。通过集合枚举在本质上不是一个线程安全的过程。在枚举与一个或多个写访问竞争的罕见情况下,确保线程安全的唯一方法是在整个枚举期间锁定集合。若要允许多个线程访问集合以进行读写操作,则必须实现自己的同步。
如果不进行同步操作?
假如一个线程进行删除操作,一个线程进行遍历操作,那么在遍历过程中,集合被修改,会导致出现InvalidOperationException的异常,提示:集合已修改;可能无法执行枚举操作。
如何同步,保证遍历的安全
这里使用了临界区,互斥锁来保证线程遍历过程的安全,示例代码如下:

 using System;
using System.Collections.Generic;
using System.Threading; namespace ConsoleApp
{
class Program
{
public static List<string> simpleList = new List<string>(); public static void Main(string[] args)
{
// 临界区对象
object lockObj = new object(); // 向List中添加测试数据
string[] data = { "", "", "", "", "", "", "", "" };
simpleList.AddRange(data);
// 此线程用于遍历数组
new Thread(new ThreadStart(() =>
{
// 用于同步,进入临界区,只有遍历完,释放临界区对象的互斥锁,才能进行写操作
lock (lockObj)
{
foreach (var item in simpleList)
{
Console.WriteLine(item);
Thread.Sleep();
}
}
})).Start();
// 此线程执行删除操作
new Thread(new ThreadStart(() =>
{
lock (lockObj)
{
simpleList.RemoveAt();
Console.WriteLine("rm 1");
Thread.Sleep();
simpleList.RemoveAt();
Console.WriteLine("rm 2");
}
})).Start(); Console.ReadLine();
}
}
}

C# 在多线程环境中,进行安全遍历操作的更多相关文章

  1. JAVA并发七&lpar;多线程环境中安全使用集合API&rpar;

    在集合API中,最初设计的Vector和Hashtable是多线程安全的.例如:对于Vector来说,用来添加和删除元素的方法是同步的.如果只有一个线程与Vector的实例交互,那么,要求获取和释放对 ...

  2. 转:【Java并发编程】之八:多线程环境中安全使用集合API(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17200509     在集合API中,最初设计的Vector和Hashtable是多线程安 ...

  3. 【Java并发编程】:多线程环境中安全使用集合API

    在集合API中,最初设计的Vector和Hashtable是多线程安全的.例如:对于Vector来说,用来添加和删除元素的方法是同步的.如果只有一个线程与Vector的实例交互,那么,要求获取和释放对 ...

  4. 【Java并发编程】之八:多线程环境中安全使用集合API

    在集合API中,最初设计的Vector和Hashtable是多线程安全的.例如:对于Vector来说,用来添加和删除元素的方法是同步的.如果只有一个线程与Vector的实例交互,那么,要求获取和释放对 ...

  5. 多线程环境中安全使用集合API(含代码&rpar;

    转自: http://blog.csdn.net/ns_code/article/details/17200509 在集合API中,最初设计的Vector和Hashtable是多线程安全的.例如:对于 ...

  6. 在多线程环境中使用CoreData

    在多线程环境中使用CoreData BY 子非鱼 · 2014 年 10 月 13 日   上回书说道,其实CoreData学起来也没有很复杂,我们其实增删改查都和别的ORM大同小异.但是世界总是很复 ...

  7. 在多线程环境中使用Jedis

    Jedis是一个Java语言的Redis客户端,它为Java语言连接与操作Redis提供了简单易用的接口. Jedis不是线程安全的.故不应该在多线程环境*用一个Jedis实例.可是.也应该避免直接 ...

  8. &lbrack;TimLinux&rsqb; django 全局变量在WSGI多进程多线程环境中的研究

    场景1: 2个进程,每个进程1个线程,请求函数中设置了10秒sleep,9个请求同一URL: 结果: 1. 全局变量ID值,在每一个进程中相同,不同进程中不相同 2. 并行只能接受2个请求,同时发起多 ...

  9. pycharm 当有多个&period;py文件在开发环境中时,如何操作可以保证运行当前面对自己的文件?

    Alt+shift+F10选择自己的py文件,执行就可以了.

随机推荐

  1. &period;NET Core采用的全新配置系统&lbrack;10&rsqb;&colon; 配置的同步机制是如何实现的?

    配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.要了解配置同步机制的实现原理,先得从认识一个 ...

  2. Hello Jexus

    一.关于 CentOS CentOS(Community Enterprise Operating System)是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照 ...

  3. 苹果Xcode 证书生成、设置、应用完整图文教程

    Xcode 证书生成.设置.应用,与大家分享. 为了能够在iPhone或iPod Touch上运行iPhone应用程序,必须使用有效的数字证书签名.这个证书用于将您的开发者身份与在注册期间所提供的已确 ...

  4. sql 定义自增id插入数据

    -- 定义一个自增变量 ; -- 执行自增语句 ,sponsorbroker,,, from stock_listing_detailed_info group by sponsorbroker;

  5. 超级链接a&plus; confirm用法

    示例: <a href="DelServlet?action=${fuwa.id}" onClick="return confirm('你确定要删除?')&quot ...

  6. mjrefresh源码分析

    最近想自己写个下拉刷新的库,但是始终感觉无从下手,想想总是容易的.原理也很简单,真正要下手写的时候,呵呵.不得不说ios封装得很好,网上可以用的成熟的库也很多,也正是因为如此很多开发者也忽略了很多底层 ...

  7. android135 360 来电去电归属地显示,自定义toast&comma;

    点击会开启服务. sivAddress.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) ...

  8. 再见&comma;CSDN

    这是第三次的博客, 首先是从百度改变自己 从他的变化二CSDN 看看多年的积累, 真的不想,但CSDN搜电缆和编辑(新MarkDown更烂)实在不敢恭维 再见CSDN, 新的博客 http://my. ...

  9. T-SQL&colon; 17 个与日期时间相关的自定义函数&lpar;UDF&rpar;&comma;周日作为周的最后一天&comma;均不受 &commat;&commat;DateFirst、语言版本影响&excl;

    原文:T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@DateFirst.语言版本影响! CSDN 的 Blog 太滥了!无时不刻地在坏! 开始抢救性搬家 ...

  10. zTree实现地市县三级级联封装类

    zTree实现地市县三级级联封装类 Province.java: /** * @Title:Province.java * @Package:com.gwtjs.model * @Descriptio ...