from:http://www.cnblogs.com/GavinCome/archive/2008/04/09/1145250.html
C# .net 多线程中集合数据同步(转)
集合类通常不是线程安全的,多个阅读器可以安全的读取集合.但是对集合的任何修改都将为访问集合的所有线程生成不明确的结果.使用以下任何方法都可以令集合类是线程安全的
(1)    使用Synchronized 方法,则从该类派生包装,并通过该包装以独占方式访问集合
(2)    如果该类没有Synchronized 方法,则从该类派生并使用SyncRoot属性实现Synchronized 方法.
(3)    在访问该集合时对SyncRoot属性使用锁定机制
这一段时间在公司做多线程的东西比较多,所以把一些心得写了下来,对关注这一块的朋友有个提示作用.
大家可以看看以下代码:
    class Program
    {
        static void Main(string[] args)
        {
            Program pg = new Program();
            //写线程
            Thread t1 = new System.Threading.Thread(new ThreadStart(pg.t1fun));
            // 读线程
            Thread t2 = new System.Threading.Thread(new ThreadStart(pg.t2fun));
            //删线程
            Thread t3 = new System.Threading.Thread(new ThreadStart(pg.t3fun));
            t1.Start();
            t2.Start();
            t3.Start();
        }
        ArrayList arraylist = new ArrayList();
        public void t1fun()
        {
            while (true)
            {
                arraylist.Add("t1--写入");
                System.Console.Out.WriteLine("写入");
                System.Threading.Thread.Sleep(1000);
            }
        }
        public void t2fun()
        {
            while (true)
            {
                for (int i = arraylist.Count - 1; i >= 0; i--)
                {
                    System.Console.Out.WriteLine("t2读取:"+(string)arraylist[i]);
                }
                System.Threading.Thread.Sleep(1000);
            }
        }
        public void t3fun()
        {
            while (true)
            {
                for (int i = arraylist.Count - 1; i >= 0; i--)
                {
                    arraylist.RemoveAt(i);
                    System.Console.Out.WriteLine("t3删除:t1"+i.ToString());
                }
                System.Threading.Thread.Sleep(1000);
            }
        }
    }
这个测试程序得简单,大家一看就明白了你可以运行一下看看,程序一会就挂了,揭示异常:
未处理的异常: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并
小于集合大小。
这就是因为多线程中对共享的集合资源同步引起的
下面是改后的代码:
    class Program
    {
        static void Main(string[] args)
        {
            Program pg = new Program();
            //写线程
            Thread t1 = new System.Threading.Thread(new ThreadStart(pg.t1fun));
            // 读线程
            Thread t2 = new System.Threading.Thread(new ThreadStart(pg.t2fun));
            //删线程
            Thread t3 = new System.Threading.Thread(new ThreadStart(pg.t3fun));
            t1.Start();
            t2.Start();
            t3.Start();
        }
        ArrayList arraylist = new ArrayList();
        public void t1fun()
        {
            while (true)
            { 
                lock (arraylist.SyncRoot)
                {
                    arraylist.Add("t1--写入");
                }
                System.Console.Out.WriteLine("写入");
                System.Threading.Thread.Sleep(1000);
            }
        }
        public void t2fun()
        {
            while (true)
            {
                lock (arraylist.SyncRoot)
                {
                    for (int i = arraylist.Count - 1; i >= 0; i--)
                    {
                        System.Console.Out.WriteLine("t2读取:" + (string)arraylist[i]);
                    }
                }
                System.Threading.Thread.Sleep(1000);
            }
        }
        public void t3fun()
        {
            while (true)
            {
                lock (arraylist.SyncRoot)
                {
                    for (int i = arraylist.Count - 1; i >= 0; i--)
                    {
                        arraylist.RemoveAt(i);
                        System.Console.Out.WriteLine("t3删除:t1" + i.ToString());
                    }
                }
                System.Threading.Thread.Sleep(1000);
            }
        }
    }

C# .net 多线程中集合数据同步的更多相关文章

  1. 将SQLServer2005中的数据同步到Oracle中

    有时由于项目开发的需要,必须将SQLServer2005中的某些表同步到Oracle数据库中,由其他其他系统来读取这些数据.不同数据库类型之间的数据同步我们可以使用链接服务器和SQLAgent来实现. ...

  2. C#多线程lock解决数据同步

    1.代码实例: public class ThreadTest4 { public static void Init() { //多个线程修改同一个值,使用lock锁解决并发 ; i < ; i ...

  3. 多线程中的lua同步问题

    最近写paintsnow::start时出现了一个非常麻烦的BUG,程序的Release版本大约每运行十几次就会有一次启动时崩溃(Debug版本还没崩溃过),崩溃点也不固定.经过简单分析之后,确定是线 ...

  4. <转>多线程中的lua同步问题

    转自 http://www.cnblogs.com/ghost240/p/3526185.html 最近写paintsnow::start时出现了一个非常麻烦的BUG,程序的Release版本大约每运 ...

  5. Java多线程学习笔记——从Java JVM对多线程数据同步的一些理解

       我们知道在多线程编程中,我们很大的一部分内容是为了解决线程间的资源同步问题和线程间共同协作解决问题.线程间的同步,通俗我们理解为僧多粥少,在粥有限情况下,我们怎么去防止大家有秩序的喝到粥,不至于 ...

  6. 数据同步DataX

    数据同步那些事儿(优化过程分享)   简介 很久之前就想写这篇文章了,主要是介绍一下我做数据同步的过程中遇到的一些有意思的内容,和提升效率的过程. 当前在数据处理的过程中,数据同步如同血液一般充满全过 ...

  7. 转载:MySQL和Redis 数据同步解决方案整理

    from: http://blog.csdn.net/langzi7758521/article/details/52611910 最近在做一个Redis箱格信息数据同步到数据库Mysql的功能. 自 ...

  8. redis和mySql的数据同步的解析

    1.同步MySQL数据到Redis (1) 在redis数据库设置缓存时间,当该条数据缓存时间过期之后自动释放,去数据库进行重新查询,但这样的话,我们放在缓存中的数据对数据的一致性要求不是很高才能放入 ...

  9. Redis和MySQL数据同步及Redis使用场景

    1.同步MySQL数据到Redis (1) 在redis数据库设置缓存时间,当该条数据缓存时间过期之后自动释放,去数据库进行重新查询,但这样的话,我们放在缓存中的数据对数据的一致性要求不是很高才能放入 ...

随机推荐

  1. CSS总结:

    给一个div加上边框,为了让他能看到边框,给他加上颜色 border: 2px solid; border-color: #00a1e9; solid表示实线边框.没有这个看不到边框. {border ...

  2. spring中autowire的用法

    Autowire模式就是在spring的声明文件里用作进行对象间的关联关系自动绑定的,就是在spring beanfactory内的一个bean对其bean的引用可以自动进行,而不一定用ref=的方式 ...

  3. 如何监控Tomcat服务器

    如何监控Tomcat服务器 发表于:2009-06-25来源:作者:点击数:2651 标签:tomcatTomcat服务器 在进行 性能测试 时,一般都需要对应用服务器进行监控,监控的指标包括应用服务 ...

  4. golang test cannot find import

    1. 能够import别的项目的main package. 2. 可是引用别的项目main package的时候,须要首先删除~/bin/main_package_name(你所引用的报名),不然回报 ...

  5. NOIP2007:纪念品分组

    #include<stdio.h> #include<stdlib.h> int a[100]; int main(){ int i,j,k,m,n,w; scanf(&quo ...

  6. sklearn 随机森林方法

    Notes The default values for the parameters controlling the size of the trees (e.g. max_depth, min_s ...

  7. github 搜索技巧

    1.关键词 + 指定开发语言 bitcoin language:javascript 2.关键词 + stars 数量 + forks 数量 bitcoin stars:> forks:>

  8. Laravel 5 教程 - 文件上传

    一.简介 Laravel 有很棒的文件系统抽象层,是基于 Frank de Jonge 的 Flysystem 扩展包. Laravel 集成的 Flysystem 提供了简单的接口,可以操作本地端空 ...

  9. Atiti. Php Laravel 5.1 环境搭建以及  error 排除

    Atiti. Php Laravel 5.1 环境搭建以及  error 排除 1. php_5.6.11_apache2.41 1.1. Httpd.Conf增加以下配置,添加php支持1 1.2. ...

  10. atitit.提取zip rar文件列表 java php c# 的原理与设计

    atitit.java提取zip rar文件列表 1. 取zip rar文件的场景问题 1 1.1. 多重压缩的问题 1 1.2. 文件名编码的问题 1 1.3. 目录的判定 1 2. rar的解析 ...