对于C#应用程序的ArrayList对象上的线程安全的多个并行读线程和偶尔的写线程,最好的方法是什么?
考虑以下场景:对于C#应用程序的ArrayList对象上的线程安全的多个并行读线程和偶尔的写线程,最好的方法是什么?,c#,.net,multithreading,locking,C#,.net,Multithreading,Locking,考虑以下场景: 该应用程序是多线程的,它有一个全局使用的静态ArrayList 该应用程序有一个线程,它完全根据不时从数据库读取的数据重构ArrayList 应用程序有N个线程并行读取此全局ArrayList 对于线程安全的多重并行读取和偶尔更改ArrayList对象,最好的方法是什么?我会考虑使用ReaderWriterLockSlim:我会考虑使用ReaderWriterLockSlim:你能不能简单地将ArrayList作为类的静态属性?然后提供get;设置围绕Arraylist对象包
- 该应用程序是多线程的,它有一个全局使用的静态ArrayList
- 该应用程序有一个线程,它完全根据不时从数据库读取的数据重构ArrayList
- 应用程序有N个线程并行读取此全局ArrayList
对于线程安全的多重并行读取和偶尔更改ArrayList对象,最好的方法是什么?我会考虑使用ReaderWriterLockSlim:我会考虑使用ReaderWriterLockSlim:你能不能简单地将ArrayList作为类的静态属性?然后提供get;设置围绕Arraylist对象包装“lock(object objMutex){…}”的访问器?这将确保在所有线程中只有对对象的同步访问。您不能简单地将Arraylist作为类的静态属性吗?然后提供get;设置围绕Arraylist对象包装“lock(object objMutex){…}”的访问器?这将确保在所有线程中只有对该对象的同步访问。如果该对象包含从数据库读取的只读数据缓存且从未被修改,则可能不需要任何同步 当然,在设置全局引用之前,您需要完全构建列表,例如:
private static ArrayList myList;
...
myList = GetListFromDatabase();
当写入线程替换列表时,如果出现争用情况,另一个线程可以获取列表的“旧”副本,但如果不修改该副本,则该旧副本仍将保持一致。如果它包含从数据库读取的只读数据缓存且从未修改过,则可能不需要任何同步 当然,在设置全局引用之前,您需要完全构建列表,例如:
private static ArrayList myList;
...
myList = GetListFromDatabase();
当写入程序线程替换列表时,如果出现争用情况,另一个线程可以获取列表的“旧”副本,但如果不进行修改,此旧副本仍将保持一致。您还可以查看System.Collections.Concurrent(如果使用.NET 4.0) 此集合针对多线程进行了优化。 关于这个容器的好文章是
您还可以查看System.Collections.Concurrent(如果使用.NET 4.0) 此集合针对多线程进行了优化。 关于这个容器的好文章是
您使用的是什么版本的框架,您使用
ArrayList
而不是List
或其他一些通用集合有什么原因吗?我使用的是framework 2.0,使用的是ArrayList
,因为。。。哦,我应该给这篇文章加上一个初学者
标签:-)你使用的是什么版本的框架,你使用ArrayList
而不是List
或其他一些通用集合有什么原因吗?我使用的是framework2.0,使用的是ArrayList
,因为。。。哦,我应该给这篇文章加上一个初学者标签:-)如果他仍然坚持2.0,就不要“苗条”;如果他仍然坚持2.0,就不要“苗条”!它很简单,也很有效。唯一的不便是,在重建ArrayList时,缓存占用2倍的内存,因为“主”ArrayList未被删除,但GC在引用新对象后收集ArrayList。很好!它很简单,也很有效。唯一的不便是,在重建ArrayList时,缓存占用2倍的内存,因为“主”ArrayList没有被删除,但GC在引用新对象后收集ArrayList。