社区
C#
帖子详情
多线程集合安全性问题
gxingmin
2007-07-17 01:42:54
有个公共集合集合ArrayList m_arryList;
现在多线程操作和访问这个集合变量
如何在其他线程对m_arryList增加或减少Items时,保证其他线程枚举时(foreach...)不会出错?
...全文
207
11
打赏
收藏
多线程集合安全性问题
有个公共集合集合ArrayList m_arryList; 现在多线程操作和访问这个集合变量 如何在其他线程对m_arryList增加或减少Items时,保证其他线程枚举时(foreach...)不会出错?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
RedGoldFish
2007-07-17
打赏
举报
回复
代码如下,其中枚举时(foreach...)的方法二更好,加锁时间短于方法一.
ArrayList m_arryList = new ArrayList();
//在线程A中运行
private void AddOrRemove()
{
lock (m_arryList.SyncRoot)
{
Object theItem = new object();
m_arryList.Add(theItem);
m_arryList.Remove(theItem);
}
}
//在线程B中运行: 方法一.
private void EnumArrayList()
{
lock (m_arryList.SyncRoot)
{
foreach (Object theItem in m_arryList)
{
Console.WriteLine(theItem.ToString());
}
}
}
//在线程B中运行: 方法二
private void EnumArrayList2()
{
lock (m_arryList.SyncRoot)
{
Object[] objects = new object[m_arryList.Count];
m_arryList.CopyTo(objects);
}
foreach (Object theItem in objects)
{
Console.WriteLine(theItem.ToString());
}
}
liusong_china
2007-07-17
打赏
举报
回复
学习
Ilovesport
2007-07-17
打赏
举报
回复
每个线程操作m_arryList都这样:
Lock(m_arryList)
{
....m_arryList....;
}
这样就OK了,不会有冲突的问题
lock关键字可将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。此语句的形式如下:
lock(expression) statement_block
其中:
expression
指定要锁定的对象。expression必须是引用类型。
通常,如果要保护实例变量,则expression为this;如果要保护static变量(或者如果临界区出现在给定类的静态方法中),则expression为typeOf(class)。
statement_block
临界区的语句。
摘自msdn
lock (this)只保护本实例
Ilovesport
2007-07-17
打赏
举报
回复
每个线程操作m_arryList都这样:
Lock(ListView1)
{
....m_arryList....;
}
这样就OK了,不会有冲突的问题
lock关键字可将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。此语句的形式如下:
lock(expression) statement_block
其中:
expression
指定要锁定的对象。expression必须是引用类型。
通常,如果要保护实例变量,则expression为this;如果要保护static变量(或者如果临界区出现在给定类的静态方法中),则expression为typeOf(class)。
statement_block
临界区的语句。
摘自msdn
lock (this)只保护本实例
whb147
2007-07-17
打赏
举报
回复
没有遇到过
lvxianda
2007-07-17
打赏
举报
回复
lock(this){
代码
}
shilei831115
2007-07-17
打赏
举报
回复
任何一个 使用的时候都要锁住变量,
gxingmin
2007-07-17
打赏
举报
回复
谢谢各位回复.
能不能再详细点?谢谢!
Avoid
2007-07-17
打赏
举报
回复
线程同步
ztenv
2007-07-17
打赏
举报
回复
把对集合的访问保护起来lock(),这样就可以不出错了,是一个互斥的问题
gxingmin
2007-07-17
打赏
举报
回复
有个公共集合变量ArrayList m_arryList;
现在多线程操作和访问这个集合变量
如何在某个线程对m_arryList增加或减少Items时,保证其他线程枚举时(foreach...)不会出错?
C#源码大
集合
第一部分 第一章 控件操作 第二章 文件管理 第三章 程序设置 第四章 系统维护 第五章 图像处理 第六章 数据库开发 第七章 网络应用 ...第10部分
安全性
第11部分 其它高级论题 第三部分
多线程
文档,实例
多线程
(4)线程安全的
集合
如果
多线程
要并发地修改一个数据结构,例如散列表,那么很容易会破坏这个数据结构。例如,一个线程可能要开始向表中插入一个新元素。假定在调整散列表各个桶之间的链接关系的过程中,被剥夺了控...
Java
多线程
之线程安全
问题
Java
多线程
中的线程安全
问题
, 解决方法, 线程安全和不安全的标准类.
java
集合
之List线程
安全性
比较总结
在
多线程
中使用
集合
list时,会有线程不安全的
问题
。所以调研了所有的list线程安全的
集合
,同时使用简单的测试,测试出相对应的性能。 线程安全的list: List<Integer> vector = new Vector<>(); ...
【
多线程
】线程安全的
集合
类
【
多线程
】线程安全的
集合
类
C#
110,561
社区成员
642,566
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章