List、Dictionary等集合类不是线程安全的吗?求教!

作者&投稿:能黎 (若有异议请与网页底部的电邮联系)
如何创建线程安全的list~

解决这个问题通常有两种方法(个人认为)
一:使用synchronized关键字,这个大家应该都很熟悉了,不解释了;
二:使用Collections.synchronizedList();使用方法如下:
假如你创建的代码如下:List> data=new ArrayList>();
那么为了解决这个线程安全问题你可以这么使用Collections.synchronizedList(),如:
List> data=Collections.synchronizedList(new ArrayList>());
其他的都没变,使用的方法也几乎与ArrayList一样,大家可以参考下api文档;
额外说下 ArrayList与LinkedList;这两个都是接口List下的一个实现,用法都一样,但用的场所的有点不同,ArrayList适合于进行大量的随机访问的情况下使用,LinkedList适合在表中进行插入、删除时使用,二者都是非线程安全,解决方法同上(为了避免线程安全,以上采取的方法,特别是第二种,其实是非常损耗性能的)。

你说的是java还是C++?
java中解决这个问题通常有两种方法
一:使用synchronized关键字;
二:使用Collections.synchronizedList();
假如你创建的代码如下:List> data=new ArrayList>();
那么为了解决这个线程安全问题你可以这么使用Collections.synchronizedList()
如:
List> data=Collections.synchronizedList(new ArrayList>());
把new关键字换一下就可以了其他的都没变,使用方法可以参考api文档;

C++中的List有两种:
一种是你自己手动实现的list数据结构,一种就是STL给你封装好的。
如果你是自己手动实现的,那么就发源码来,我帮你看怎么优化。
如果是用stl的
那么你不能期望STL给你线程支持,因为它要的是效率。
需要注意的是:
1. 多个线程的读是安全的。多线程可同时读取一个容器内容。只能是读,不能写。
2. 对不同容器的多个写入是安全的。多线程可以同时写不同容器。 注意,是不同容器。
所以你应该自己写一个针对容器的模板类来实现加锁(构造的时候加锁,析构的时候释放),然后在访问容器的时候,定义一个该类的临时变量,临时变量可以保证如果抛出了异常,该临时对象也会被销毁,从而也释放掉锁。

参考MSDN
LIST线程安全
--------------------------------------------------------------------------------

此类型的公共静态(在 Visual Basic 中为 Shared)成员是线程安全的。 但不能保证任何实例成员是线程安全的。

只要不修改该集合, List<T>就可以同时支持多个阅读器。 枚举整个集合本质上不是一个线程安全的过程。在枚举与一个或多个写访问竞争的罕见情况下,确保线程安全的唯一方法是在整个枚举期间锁定集合。若允许多个线程对集合执行读写操作,您必须实现自己的同步。

简单点的就用ArrayList和Hashtable这两个的静态函数,他们有线程同步的一个工厂函数,不过不是泛型的。其实List、Dictionary也有类似的静态工厂函数,不过是internal的,我们用不了。


求莫扎特的详细资料以及所有作品名称列表、介绍
莫扎特简介 1756年1月27日沃尔夫冈·阿玛多伊斯·莫扎特,生于萨尔兹堡一个宫廷乐师家里,杰出的奥地利作曲家,维也纳古典乐派的杰出代表。莫扎特很小的时候就显露出极高的音乐天赋,即兴演奏和作曲都十分出色,被誉为“神童”。他短暂的一生作品极其丰富,创作的重要领域是歌剧和交响乐。在他的作品中洋溢着...

丰台区18822942767: 简述List<>和dictionary<k,v>的区别 -
长兴绍苏泰: list是泛型集合.里面成装的是实体类.可以实例化.dictionary的功能比较简单,只能算是功能强点的数组.里面储存的键值对.

丰台区18822942767: List、Dictionary等集合类不是线程安全的吗?求教! -
长兴绍苏泰: 参考MSDN LIST线程安全 --------------------------------------------------------------------------------此类型的公共静态(在 Visual Basic 中为 Shared)成员是线程安全的. 但不能保证任何实例成员是线程安全的.只要不修改该集合, List<T>就可以同时支持多个阅读器. 枚举整个集合本质上不是一个线程安全的过程.在枚举与一个或多个写访问竞争的罕见情况下,确保线程安全的唯一方法是在整个枚举期间锁定集合.若允许多个线程对集合执行读写操作,您必须实现自己的同步.

丰台区18822942767: python的内置字典数据类型为? -
长兴绍苏泰: python中有六个标准的数据类型: Number(数字)、String(字符串)、List(列表)、Tuple(元组)、Sets(集合)、Dictionary(字典) 字典只是其中之一

丰台区18822942767: C#中最常用的集合类? -
长兴绍苏泰: Dictionary<>,List<>等都很好用啊

丰台区18822942767: C#中List<T>列表集合和Dictionary<key,value>在什么情况下使用? -
长兴绍苏泰: 一个没有索引,一个带有索引. 就像一本书一样,如果没有目录,那么就相当于List了;如果这本书带有所以,那就相当于Dictionary了. 当你想创建带有索引的集合可以用Dictionary,如果纯粹就是为了记录一个数据集——不分组,就可以利用List. 我举个例子: 张三:男;李四:女;王五:男.这三个人如果存到List里面的话(如果仅存名字),是无法知道男女的,但是如果用Dictionary的话就可以用“男/女”作为key,把名字(张三、李四、王五)作为value存储.

丰台区18822942767: C#中有哪些集合类,简述各自的特点? -
长兴绍苏泰: List<T> 泛型强类型列表,可以通过索引访问,内部是数组实现 Dictionary<TKey, TValue> 泛型强类型字典,表示键值对的集合,使用键访问,内部是哈希表实现 Stack<T> 栈,后进先出集合 Queue<T> 队列,先进先出集合最常用的就是上面几个 其他的还有LinkedList<T>(双向链表),HashSet<T>, SortedList<TKey, TValue>等还有各自的非泛型版本,比如List<T>对应的ArrayList,Dictionary<TKey, TValue>对应的HashTable,还有Queue<T>对应的Queue,这些都已过时,建议不要再用

丰台区18822942767: c#中List,Dictionary,ArrayList,Hashtable和数组的区别是什么 -
长兴绍苏泰: 可以分成两组,ArrayList与List一组,都和数组类似,前者是.net1里的,List是泛型版是.net2.0以后的,基本后面就很少用ArrayList了.Hashtable和Dictionary都是由键和值的对组成的,后者又是泛型的,应用更普遍,不过还有些细微的差别你可以自己查查.

丰台区18822942767: Dictionary 还有 Hashtable 还有list 貌似都可以完成类似的功能?区别在哪? -
长兴绍苏泰: ArrayList和List(他们两个的行为基本相同) Hashtable和Dictionary(他们两个的行为基本相同) 实际使用中,我们很少用么前者,因为List <T>, Dictionary <TKey, TValue>类在大多数情况下执行得更好并且是类型安全的,他们都指定了一个引...

丰台区18822942767: 如何理解数据结构中的 字典Dictionary -
长兴绍苏泰: 数据字典是整个数据库环境的重要组成部分,是数据库环境管理的有力工具,在数据库的生命周期内起着重要作用.数据字典的用途是多方面的,它是一个管理有关数据库设计、实现、运行和扩充阶段的各种信息的工具.数据字典(Data ...

丰台区18822942767: Dictionary类型里面可以添加list类型吗?怎么做 -
长兴绍苏泰: 可以添加任何类型Dictionary<int,List<string>> obj = new Dictionary<int,List<string>>();

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网