以下集合对象中哪几个是线程安全的集合对象

首先要明白线程的工作原理,jvm有一个main memory,而每个线程有自己的working&
memory,一个线程对一个variable进行操作时,都要在自己的working&
memory里面建立一个copy,操作完之后再写入main&
memory。多个线程同时操作同一个variable,就可能会出现不可预知的结果。根据上面的解释,很容易想出相应的scenario。&
而用synchronized的关键是建立一个monitor,这个monitor可以是要修改的variable也可以其他你认为合适的object比如method,然后通过给这个monitor加锁来实现线程安全,每个线程在获得这个锁之后,要执行完&
load到workingmemory -& use&assign -& store到mainmemory&
的过程,才会释放它得到的锁。这样就实现了所谓的线程安全。
什么是线程安全?线程安全是怎么完成的(原理)? 线程安全就是说多线程访问同一代码,不会产生不确定的结果。编写线程安全的代码是低依靠线程同步。
java相关集合
Vector、ArrayList、LinkedList
Vector和ArrayList在使用上非常相似,都可用来表示一组数量可变的对象应用的集合,并且可以随机地访问其中的元素。 &
Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。 &
& & ArrayList和LinkedList区别 &
   对于处理一列数据项,Java提供了两个类ArrayList和LinkedList,ArrayList的内部实现是基于内部数组Object[],所以从概念上讲,它更象数组,但LinkedList的内部实现是基于一组连接的记录,所以,它更象一个链表结构,所以,它们在性能上有很大的差别。 &
   从上面的分析可知,在ArrayList的前面或中间插入数据时,你必须将其后的所有数据相应的后移,这样必然要花费较多时间,所以,当你的操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能 &
   而访问链表中的某个元素时,就必须从链表的一端开始沿着连接方向一个一个元素地去查找,直到找到所需的元素为止,所以,当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。 &
   如果在编程中,1,2两种情形交替出现,这时,你可以考虑使用List这样的通用接口,而不用关心具体的实现,在具体的情形下,它的性能由具体的实现来保证。 & &
HashTable,HashMap,HashSet
HashTable和HashMap采用相同的存储机制,二者的实现基本一致,不同的是:
1)、HashMap是非线程安全的,HashTable是线程安全的,内部的方法基本都是synchronized。
2)、HashTable不允许有null值的存在。
在HashTable中调用put方法时,如果key为null,直接抛出NullPointerException。其它细微的差别还有,比如初始化Entry数组的大小等等,但基本思想和HashMap一样。
1、HashSet基于HashMap实现,无容量限制。
2、HashSet是非线程安全的。&
3、HashSet不保证有序。&
1、HashMap采用数组方式存储key,value构成的Entry对象,无容量限制。
2、HashMap基于Key hash查找Entry对象存放到数组的位置,对于hash冲突采用链表的方式来解决。
3、HashMap在插入元素时可能会要扩大数组的容量,在扩大容量时须要重新计算hash,并复制对象到新的数组中。
4、HashMap是非线程安全的。
5、HashMap遍历使用的是Iterator&
1、HashTable是线程安全的。
2、HashTable中无论是Key,还是Value都不允许为null。
3、HashTable遍历使用的是Enumeration。&
TreeSet,TreeMap
&TreeSet:
&1、TreeSet基于TreeMap实现,支持排序。
&2、TreeSet是非线程安全的。
& & 从对HashSet和TreeSet的描述来看,TreeSet和HashSet一样,也是完全基于Map来实现的,并且都不支持get(int)来获取指定位置的元素(需要遍历获取),另外TreeSet还提供了一些排序方面的支持。例如传入Comparator实现、descendingSet以及descendingIterator等。
TreeMap:&
1、TreeMap是一个典型的基于红黑树的Map实现,因此它要求一定要有Key比较的方法,要么传入Comparator实现,要么key对象实现Comparable接口。
2、TreeMap是非线程安全的。
本文已收录于以下专栏:
相关文章推荐
java集合的线程安全
synchronized集合
java集合框架提供了多种synchronized集合, 比如Vector, HashTable, Collections的synchronizedXxx方法的返回...
ConcurrentHashMap
CopyOnWrite
HashTableHashTable特点
1. 和HashMap都是散列表,储存键值对映射
2. 继承Diction...
这里我把ConcurrentLinkedDeque与List进行对比测试了一下,发现在多线程情况下一般的集合会出现很大的并发性问题,下面就一起探索一下
1.使用ConcurrentLinkedDeq...
原文地址:/news/5.shtml
ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?StringB...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Vector、ArrayList、LinkedList
Vector和ArrayList在使用上非常相似,都可用来表示一组数量可变的对象应用的集合,并且可以随机地访问其中的元素。& Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。 LinkedList也不是线程安全的。
ArrayList和LinkedList区别 对于处理一列数据项,Java提供了两个类ArrayList和LinkedList,ArrayList的内部实现是基于内部数组Object[],所以从概念上讲,它更象数组,但LinkedList的内部实现是基于一组连接的记录,所以,它更象一个链表结构,所以,它们在性能上有很大的差别。 &从上面的分析可知,在ArrayList的前面或中间插入数据时,你必须将其后的所有数据相应的后移,这样必然要花费较多时间,所以,当你的操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能 &而访问链表中的某个元素时,就必须从链表的一端开始沿着连接方向一个一个元素地去查找,直到找到所需的元素为止,所以,当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。 &如果在编程中,1,2两种情形交替出现,这时,你可以考虑使用List这样的通用接口,而不用关心具体的实现,在具体的情形下,它的性能由具体的实现来保证。
HashTable,HashMap,HashSet
HashTable和HashMap采用相同的存储机制,二者的实现基本一致,不同的是:1)、HashMap是非线程安全的,HashTable是线程安全的,内部的方法基本都是synchronized。2)、HashTable不允许有null值的存在。在HashTable中调用put方法时,如果key为null,直接抛出NullPointerException。其它细微的差别还有,比如初始化Entry数组的大小等等,但基本思想和HashMap一样。
HashSet:1、HashSet基于HashMap实现,无容量限制。2、HashSet是非线程安全的。 3、HashSet不保证有序。 HashMap:1、HashMap采用数组方式存储key,value构成的Entry对象,无容量限制。2、HashMap基于Key hash查找Entry对象存放到数组的位置,对于hash冲突采用链表的方式来解决。3、HashMap在插入元素时可能会要扩大数组的容量,在扩大容量时须要重新计算hash,并复制对象到新的数组中。4、HashMap是非线程安全的。5、HashMap遍历使用的是Iterator HashTable1、HashTable是线程安全的。2、HashTable中无论是Key,还是Value都不允许为null。3、HashTable遍历使用的是Enumeration。
TreeSet,TreeMap
TreeSet:&1、TreeSet基于TreeMap实现,支持排序。&2、TreeSet是非线程安全的。从对HashSet和TreeSet的描述来看,TreeSet和HashSet一样,也是完全基于Map来实现的,并且都不支持get(int)来获取指定位置的元素(需要遍历获取),另外TreeSet还提供了一些排序方面的支持。例如传入Comparator实现、descendingSet以及descendingIterator等。TreeMap: 1、TreeMap是一个典型的基于红黑树的Map实现,因此它要求一定要有Key比较的方法,要么传入Comparator实现,要么key对象实现Comparable接口。2、TreeMap是非线程安全的。
Vector,HashTable是线程安全的。
ArrayList,LinkedList,HashMap,TreeMap,HashSet,TreeSet都不是线程安全的。
java.util.concurrent包提供了映射表、有序集和队列的高效实现,允许并发访问:ConcurrentHashMap,ConcurrentSkipListMap,ConcurrentSkipListSet,ConcurrentLinkedQueue
当然对于上述线程不安全的集合也可以使用同步包装器Collections.synchronizedList(List&T&&list)等,使得集合的方法使用锁加以保护,提供了线程安全的访问。如果在另一个线程可能进行修改时要对集合进行迭代,仍然需要使用&客户端&锁定。
阅读(...) 评论()怎么理解集合中线程安全和不安全的问题? - 知乎28被浏览3073分享邀请回答ArrayList&String& list = new ArrayList&&();
synchronized (list) {
list.add("233");
而Vector里面只要酱紫写就行了:Vector&String& list = new Vector&&();
list.add("233");
为什么?因为ArrayList的add方法是酱紫定义的:public boolean add(E object) {
而Vector的add方法是酱紫定义的:public synchronized boolean add(E object) {
所以同样调用add()方法,对Vector对象再加synchronized就是多此一举。7添加评论分享收藏感谢收起21 条评论分享收藏感谢收起查看更多回答

我要回帖

更多关于 c 线程安全的集合 的文章

 

随机推荐