两个线程同时操作一个集合,一个线程读,一个线程写。有可能会产生并发问题吗?

问题描述

两个线程同时操作一个集合,一个线程读,一个线程写。有可能会产生并发问题吗?

我下面的代码为啥没有并发问题? 请哪位大神指导下

class Program
{
    public Thread Threadone;
    public Thread Threadtwo;
    public event EventHandler EventRun;
    public static object obj=new object();
    ArrayList ListArry = new ArrayList();
    private static void Main(string[] args)
    {
        var p = new Program();
        p.Init();
        Console.ReadKey();
    }

    private void Init()
    {
        Threadone=new Thread(AddArry);
        Threadtwo = new Thread(ReadArry);
        Threadone.Start();
        Threadtwo.Start();
    }
    /// <summary>
    /// 读取数据
    /// </summary>
    private void ReadArry()
    {
        for (int i = 0; i < ListArry.Count; i++)
        {
            lock (ListArry.SyncRoot)
            {
                Console.WriteLine(ListArry[i]);
            }

            Thread.Sleep(100);
        }
        Console.WriteLine("线程{0}读取完成", Thread.CurrentThread.Name);
        EventRun+=Program_EventRun;
    }

    private void Program_EventRun(object sender, EventArgs e)
    {
        Threadtwo.Abort();
    }

    private void Program_EventRun1(object sender, EventArgs e)
    {
        Threadone.Abort();
    }
    /// <summary>
    /// 写入数据
    /// </summary>
    private void AddArry()
    {
        var rand = new Random(1000);
        for (int i = 0; i < 100; i++)
        {

            var num = rand.Next();
            lock (ListArry.SyncRoot)
            {
                ListArry.Add(num);
            }
            Thread.Sleep(100);
        }
        Console.WriteLine("线程{0}写完成。", Thread.CurrentThread.Name);
        EventRun += Program_EventRun1;
    }
}

解决方案

多线程编程的时候往往用到互斥锁与信号量使得线程同步,如果不按此方法进行安全编程,很有可能使得线程对境界资源访问的时候出现竞态。注意:我们需要达到的是线程同步,需要避免的是竞态。从你的提问中可以看出你对同步的概念并不太理解

时间: 2024-08-12 19:13:47

两个线程同时操作一个集合,一个线程读,一个线程写。有可能会产生并发问题吗?的相关文章

C#中判断一个集合是否是另一个集合的子集的简单方法_C#教程

看到这个标题,我们首先想到的是循环遍历其中一个数组,判断数组中的每个元素是否都在另一个数组中出现了,以此来判断该数组是不是另一个数组的子集,但是这样做就太过复杂了,有没有简单一点的方法呢? 打个比方,有这样的两个集合: 复制代码 代码如下: string[] bigArr = new string[] { "a", "b", "c" }; string[] smallArr = new string[] { "a", &quo

SQL 比较一个集合是否在另一个集合里存在的方法分享_MsSql

复制代码 代码如下: DECLARE @c INT DECLARE @c2 INT SELECT @c = COUNT(1) FROM dbo.SplitToTable('1|2|3|4', '|') SELECT @c2=COUNT(1) FROM dbo.SplitToTable('1|2|3|4', '|') a INNER JOIN dbo.SplitToTable('1|2|3|', '|') b ON a.value = b.value IF @c = @c2 SELECT 'ok'

数据结构 c语言-C语言数据结构课程设计实现一个集合数据结构

问题描述 C语言数据结构课程设计实现一个集合数据结构 题目:设计并实现一个集合数据结构Set.一个集合中没有重复元素,支持下列运算: boolean add(E o) 如果 set 中尚未存在指定的元素o,则添加此元素. boolean addAll(Set c) 如果 set 中没有指定集合c中的所有元素,则将其添加到此 set 中. void clear() 移除 set 中的所有元素. boolean contains(E o) 如果 set 包含指定的元素o,则返回 true. bool

有一个WEB服务器,两个客户同时操作JSP页面,一个删除一条数据,一个正好查询这条数据,报错了,怎么解决啊,急!!

问题描述 有一个WEB服务器,两个客户同时操作JSP页面,一个删除一条数据,一个正好查询这条数据,报错了,怎么解决啊,急!! 解决方案 解决方案二:引用楼主duobiao的回复: 有一个WEB服务器,两个客户同时操作JSP页面,一个删除一条数据,一个正好查询这条数据,报错了,怎么解决啊,急!! ......怎么会出错呢难道你做什么都不判断么?解决方案三:报啥错?解决方案四:一句话问题!不知道你是用什么做的,操作数据库用的是什么,数据库用的是什么,反正要有的什么都没有!解决方案五:引用2楼swan

Ajax无刷新 返回一个集合

问题描述 我要这样一个效果有一个下拉列表框,里面是产品的类型有:酒类.饮料类.日用品类.比如当我选择了酒类,那么就查询显示所有酒类的产品,显示的是一个集合.我想使用Ajax无刷新技术.但是貌似Ajax返回的只是一个String值,请问有谁知道可以返回一个集合实现我要的效果吗? 解决方案 解决方案二:dwr解决方案三:Ajax返回的是一个xml文件.你可以自己设计xml文件的结构,当然可以保存多个数据了.解决方案四: 解决方案五:组织成json数据解决方案六:使用json数据解决方案七:json数

实现Java删除一个集合的多个元素_java

问题 我需要从一个java的集合中,根据另一个集合的内容,删除第一个集合中不特定的元素.这看上去非常简单,但却遇到了问题. 这是我要写的方法的头部 private void screenBlackNameList(List<SharedBoardSmsWrapper> source, List<BlackNameListModel> blackNameList) 事情是这样子的.source集合中保存了一些显示用的数据元素.blackNameList集合中保存的是黑名单列表.我们需

java-为什么网上很多文章说 Cursor是一行的集合?明明是一个接口

问题描述 为什么网上很多文章说 Cursor是一行的集合?明明是一个接口 http://www.2cto.com/kf/201109/103163.html抄来抄去,转来转去,基本就上面链接里这个文章,说Cursor是每行的集合.android 官方api是这么描述Cursor的:"This interface provides...."这是一个接口啊,所以是我理解太肤浅还是网上的文章描述不够专业? 另外在进行数据库操作时,会有类似下面的语句: Cursor cursor = db.q

建表-当我要查询的数据同时在两个表中时,是否应该再建一个新的表?

问题描述 当我要查询的数据同时在两个表中时,是否应该再建一个新的表? 我有一个收入表(表1),一个支出表(表2),然后这样的话就可以对它们进行操作,但是我现在想要查询一个月之内的收支记录,按时间先后排序,我该怎么做呢?我要再建一个表把表1,表2的数据插进去么?还是有别的办法? 解决方案 使用联表连接两个表将两个表的数据同时显示出来或者将两个表的数据查出来后放入到视图当中 解决方案二: 当我每查询一次(当表1,表2更新时)的时候都要先把数据放到视图当中,是不是应该用触发器啊? 解决方案三: 你可以

ognl-OGNL集合一个值怎么投影到另外一个集合的值上

问题描述 OGNL集合一个值怎么投影到另外一个集合的值上 先有一个posts集合 里面有文章名称和文章内容和一个文章类型ID,还有另一个集合是文章类型集合tags有类型ID和类型名称以及类型说明.现在已经迭代输出了posts集合,但是文章类型一块我要输出ID对应的类型名称,相当于循环中需要查询另外一个集合的内容匹配.应该怎么操作呢?