多线程访问list报错

neo2616 2013-01-05 11:30:28
请教大家一个问题

多线程访问并修改单利里的数据到底是否线程安全?是否同步?

我在单利中有一个List对象,多个线程多其进行添加或修改操作,我发现有时候会报错,提示多线程访问有冲。迷茫了...
哪位神仙指点一下
...全文
497 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
neo2616 2013-01-05
  • 打赏
  • 举报
回复
谁知道开源的 用于多线程安全的 数据缓存的类库
neo2616 2013-01-05
  • 打赏
  • 举报
回复
单利本身是线程同步的并且是安全的,这点没错吧?
wangyd324 2013-01-05
  • 打赏
  • 举报
回复
最好加双重锁~~~
six-years 2013-01-05
  • 打赏
  • 举报
回复
多线程同时修改list会报错很正常吧 要自己加锁
neo2616 2013-01-05
  • 打赏
  • 举报
回复
网上也有很多资料说,在单利中放一个变量,多个线程访问时会自动加锁,不会有冲突。
neo2616 2013-01-05
  • 打赏
  • 举报
回复
list不是线程安全的我知道,微软还有一个线程同步的List类,问题是,单利是线程安全的,里面的List或hashtable等数据都应该是线程安全的呀
cheng2005 2013-01-05
  • 打赏
  • 举报
回复
List的实例可不是线程安全的,这个MSDN写的清清楚楚明明白白。自己处理同步去。
hard_learner 2013-01-05
  • 打赏
  • 举报
回复
单例中可以加双重锁
neo2616 2013-01-05
  • 打赏
  • 举报
回复
15楼和13楼的代码和在一起可以解决我的问题
ViewStates 2013-01-05
  • 打赏
  • 举报
回复
引用 22 楼 neo2616 的回复:
大家解答了我的问题,又似乎没有说清楚。 第一 如果单利里的list没有同步,为什么他不报错(访问冲突)。 第二,我在单利里用list的方式可能不对,list是线程安全的,但是list里面的值是不安全的,即可能出现脏数据,对不对?除非对list 加lock才能保证list里的元素不会错
你操作那个list的时候有一定几率会报错,比如你在往这个list里面添加数据时同时list已经达到其最大容量需要扩容的时候。 List<T>中提供的所有实例方法都是非线程安全的,你所谓的脏数据的定义是什么?
ViewStates 2013-01-05
  • 打赏
  • 举报
回复
根据你代码感觉你的需求是需要不同线程能够添加删除TASK,如果是这样你根本就不应该暴露你那个property,相反你应该暴露两个实例方法分别去获取一个task实例和删除一个task实例,然后在这两个方法的实现上去确保线程安全。 而且你的确对单例理解有偏差,你这样的写法只能保证所有线程获取到的对象是同一个实例,但不保证你这个实例方法中的线程安全。
neo2616 2013-01-05
  • 打赏
  • 举报
回复
大家解答了我的问题,又似乎没有说清楚。 第一 如果单利里的list没有同步,为什么他不报错(访问冲突)。 第二,我在单利里用list的方式可能不对,list是线程安全的,但是list里面的值是不安全的,即可能出现脏数据,对不对?除非对list 加lock才能保证list里的元素不会错
「已注销」 2013-01-05
  • 打赏
  • 举报
回复
看能不能把list分段 然后线程去用或者修改
cheng2005 2013-01-05
  • 打赏
  • 举报
回复
引用 15 楼 neo2616 的回复:
public class ThreadShareData { static readonly ThreadShareData entity = new ThreadShareData(); List<Task> _listUrl = new List<Task>(); private ThreadShare……
多线程访问ThreadShareData.ListUrl是线程安全的 这是谁告诉你的?劝你左右开弓抽他一个360度大嘴巴。
neo2616 2013-01-05
  • 打赏
  • 举报
回复
引用 16 楼 gxingmin 的回复:
线程操作List,要加锁 lock(lst) { //对lst操作 .... }
貌似不对,第一次出错我就试过,实时上在单利里是自动加锁的吧
neo2616 2013-01-05
  • 打赏
  • 举报
回复
是我对单利的理解有误还是我用的不对
gxingmin 2013-01-05
  • 打赏
  • 举报
回复
线程操作List,要加锁 lock(lst) { //对lst操作 .... }
neo2616 2013-01-05
  • 打赏
  • 举报
回复
public class ThreadShareData { static readonly ThreadShareData entity = new ThreadShareData(); List<Task> _listUrl = new List<Task>(); private ThreadShareData() { } static public ThreadShareData Instance() { return entity; } //需要访问的url列表 public List<Task> ListUrl { get { return _listUrl; } set { _listUrl = value; } } } 多线程访问ThreadShareData.ListUrl是线程安全的,这样也可实现数据多线程访问的目的。可是我有时候报错,让我很意外。
neo2616 2013-01-05
  • 打赏
  • 举报
回复
代码很好,谢谢分享。
加载更多回复(5)

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧