如何让几个线程同时访问一个集合里面的元素?
如何让几个线程同时访问一个主线程里的集合中的对象,
设计出比较 高效率的方法,
尽量让所有线程不闲置,
但是又要保证数据同步性。
怎么搞?
------解决方案--------------------何为"同时访问"?
1、如果只是读取,则没有同步问题。
2、如果是有读有写,则要考虑同步。而根据读写的规律,可以有不同的同步优化。
3、"线程不闲置"属于任务分配的范畴(比如任务的粒度,调度的策略),跟数据同步没有多大的关系。
------解决方案--------------------多线程访集合item,对集合中的Item进行lock,如果访问到的Item已经被lock则可以等待或者略过访问下一项,lock和判断是否被lock可以使用
if(Monitor.TryEnter(item))//如果获得了锁
{
//do something
Monitor.Exit(item);
}
else
{
//处理下一个item
}
------解决方案--------------------如果要对List<T>进行的item的添加删除,则需要lock(list)
------解决方案--------------------同步集合和同步集合里面的元素是两个不同的概念。
------解决方案--------------------
------解决方案--------------------如果你跟踪线程池中利用情况,假设就是简单地一个服务程序在监听和处理消息,假设有上千个客户端保持连接,你可能看到瞬间使用了20个线程、然后使用了30个线程,然后10几秒钟之后只使用了5个线程.....总之线程分配是瞬间的,线程知识用来做几毫秒的工作(而不是做什么“死循环、轮询”工作),系统使用多少线程数是不确定的。但总的来说,平均使用少量线程,就能以非常高的并发率来处理大量异步请求,处理过程中不会感觉到阻塞。
例如一个基于地图的复杂GIS系统上同时对服务器发起50个请求,这50个请求的返回次序自然跟发命令的次序没有关系(因为是异步并行地嘛),虽然平均每一个请求的响应时间达到了20毫秒,可是50个请求确可以保证在200毫秒内(而不是1000毫秒开外)全都执行完毕。
------解决方案--------------------另外“主线程有1000个对象”、“另外两条线程则是操作这1000个对象的”这样的描述也充分暴露了设计问题。
线程执行的就是一个简单的瞬间结束的方法,它的目的可不是去“死循环轮询”对象。
------解决方案--------------------lz。你那集合的元素数量是不是不会变化?如果是不会变化,那你这里多线程访问的重点是集合中的对象。也就是说同一时刻,集合中的某个特定对象会被多线程访问,并不是你的集合本身会被多线程访问。所以你应该重构你集合中保存的那个对象类型。让对这个类型的属性的读取是线程安全的。所以你对集合的操作加不加lock无所谓。关键是集合中的对象的属性在set或get的时候要加lock。