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);
            }
        }
    }

原地址Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1804617

转载于:https://www.cnblogs.com/GavinCome/archive/2008/04/09/1145250.html

C# .net 多线程中集合数据同步相关推荐

  1. 利用nginx集群式部署服务器中,数据同步问题

    最近在项目中遇到了一个数据同步的问题 项目部署背景:利用nginx集群式服务器部署,使用唯一的一台数据库服务器,数据库为mysql 问题描述:对一个账户进行更新操作,一个未查明的原因,用户点击更新操作 ...

  2. 现宣布Windows Azure中SQL数据同步的增强功能

    我们很高兴宣布SQL数据同步服务迎来了更新,现可以在所有Windows Azure数据中心中操作.过去的两次更新(六月.八月)除了为预览版带来一般可靠性的改进外,还带来了如下的增强功能: ·      ...

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

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

  4. SQL Server Always On可用性组中的数据同步

    This article describes the data synchronization process on SQL Server Always On Availability Groups ...

  5. 大数据-数仓-数据采集-业务数据(二):全量同步采集【MySQL<-->DataX(全量)<-->HDFS】【每日全量:每天都将业务数据库中全部数据同步到数据仓库,是保证两侧数据同步的最简单方式】

    DataX源码地址:GitHub - alibaba/DataX: DataX是阿里云DataWorks数据集成的开源版本. 一.第1章 DataX介绍 1.1 DataX概述 1. 介绍:DataX ...

  6. kafka中副本数据同步策略 ,acknowledge的发送策略,kafka的数据可靠性保证

    ack(acknowledge)简介 为保证producer发送的数据,能可靠的发送到指定的topic,topic的每个partition收到producer发送的消息后,都需要向producer发送 ...

  7. Elasticsearch和Hive整合,将hive数据同步到ES中

    1 Elasticsearch整合Hive 1.1 软件环境 Hadoop软件环境 Hive软件环境 ES软件环境 1.2 ES-Hadoop介绍 1.2.1 官网 https://www.elast ...

  8. 集群没有leader_ZooKeeper 集群中 Leader 与 Follower 的4种数据同步策略

    首先要声明一点,zk集群中,leader服务器有着比较重要的存在,Follower 服务器只是处理非事务性请求,leader服务器主要负责事务性请求,Follower 服务器在遇到事务性请求以后还是会 ...

  9. Apache ZooKeeper - ZooKeeper 集群中 Leader 与 Follower 的数据同步策略

    文章目录 流程图 why ? How ? 何时触发数据同步的机制? 同步哪些数据 同步方式 DIFF 同步 TRUNC+DIFF 同步 TRUNC 同步 SNAP 同步 同步后的处理 源码分析 流程图 ...

  10. 数据同步的终极解决方案,阿里巴巴开源的Canal框架当之无愧!!

    写在前面 在当今互联网行业,尤其是现在分布式.微服务开发环境下,为了提高搜索效率,以及搜索的精准度,会大量使用Redis.Memcached等NoSQL数据库,也会使用大量的Solr.Elastics ...

最新文章

  1. 六、springboot整合swagger
  2. c java 传参数_Java和C的方法参数传递方式的比较
  3. Beta 冲刺(4/7)
  4. 与虫子尾交3d动画网站_PPT中最酷的效果 —— 3D模型全解
  5. windows进程间通信方式总结
  6. strcpy和strncpy区别 memcpy strcpy strncpy lstrcpy lstrncpy wstrcpy, memmove
  7. Boost:bzip2解压缩器
  8. 简单理解AOP(面向切面编程)
  9. python访问web网页_python访问web的利器:urllib2
  10. Android studio编译出现Failed to finalize session : INSTALL_FAILED_INVALID_APK
  11. android 文本倒影,android案例---图片处理倒影效果
  12. Linux arm 下载程序,arm-linux—gcc如何下载安装
  13. String和ByteBuffer互转
  14. mysql词法分析antlr4_sharding-jdbc之ANTLR4 SQL解析
  15. web安全day8:深入浅出掌握windows域
  16. Atitit velocity 模板引擎使用法 目录 1.1. 1.4 Context 1 1.1.1. 1.4.1 Context 基本概念 1 1.2. .3不同模式下使用velocity 1
  17. QUnit 5分钟教程
  18. 大学毕业生,关于转正定级和干部身份你懂吗?
  19. ppt竖排文字方向HTML 5,PPT文本框中文字方向的设置方法是什么
  20. win10换win7系统步骤操作详解分享

热门文章

  1. Android Android.mk脚本结构
  2. oracle数据库删除用户(schema)操作
  3. 以太坊概念知识入门篇
  4. 作为大数据开发中最重要技术,spark需要掌握哪些技能呢
  5. 区块链应用 | 区块链火了,这到底是虚火还是实火?
  6. php--获取用户ip
  7. 代码阅读工具-global
  8. 调用一个Activity并返回结果
  9. 简记mysql在tomcat下和hibernate一起使用,No suitable driver found for的问题
  10. Out of Browser 开篇