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. SQLSERVER常用计数器

    复制下面全部--开始--运行--profmon.exe--性能监视器--粘贴计数器列表 <OBJECT ID="DISystemMonitor1" WIDTH="1 ...

  2. Hibernate 多对一关联查询

     版权声明:本文为博主原创文章,如需转载请标注转载地址.  博客地址:http://www.cnblogs.com/caoyc/p/5598269.html  一.单向多对一和双向多对一的区别 如果只 ...

  3. test_login

    import unittest,requestsimport ddtfrom BeautifulReport import BeautifulReport as bffrom urllib impor ...

  4. 【Linux设备驱动程序】Chapter 1 - 概述

    设备分类 字符设备.块设备.网络接口 字符设备 能够像字节流(类似文件)一样被访问的设备. 字符设备驱动程序通常至少要实现 open.close.read 和 write 系统调用. 举例:字符终端( ...

  5. IOT表

    以前在接触索引的时候,就想过要是表字段太少,索引效果不是很不好吗,直接用索引不是更直接吗?后来因为懒惰也没有去查找相关资料.正好今天看到了table organization index,看了一下,实 ...

  6. c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)

    c#封装DBHelper类   public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...

  7. Mac 全局变量 ~/.bash_profile 文件不存在的问题

    不存在就新建呗~ $ cd ~/ $ touch .bash_profile $ open -e .bash_profile 然后输入以下内容 # set color的部分是配置iterm2的字体颜色 ...

  8. gdi软光栅化注意事项

    1,opengl viewport原点在左下角,而gdi画图api原点在左上角,所以在实现了整个opengl管线,最后将点通过gdi函数画到屏幕时要进行临时转化. 2,注意gdi画点的api传入的颜色 ...

  9. atitit.项目设计模式---ioc attilax总结

    atitit.项目设计模式---ioc attilax总结 1. .IOC的之前 1 2. ioc后的实现 1 3. 认识引入IOC框架的缺点, 2 4. 自己实现ioc 3 4.1. ioc框架的实 ...

  10. log4c面向对象设计 (转)

    转自 http://blog.csdn.net/xkarl/article/details/6340180 Log4C,Log4CPlus/Log4cpp,Log4j,Log4Net,Log4Perl ...