您的位置 首页 java

java集合(List,Set,Map)线程安全

java 集合(List,Set,Map) 线程安全

线程安全:

提到线程安全,首先要明白 线程 的工作原理,java JVM有一个main memory,而每个线程有自己的working memory,一个线程对一个variable进行操作时都要在自己的working memory里面建立一个copy,操作完之后再写入main memory。多个线程同时操作同一个variable就可能出现不可预知的结果。根据上面的解释,很容易想出对应的解决方案。通常使用 Synchronized 的同步锁可以解决这一问题,当一个线程操作集合时,首先会对集合加锁,处理完成后会释放锁,在加锁的过程中,其他线程无法操作此集合。

什么是线程安全?

线程安全就是说 多线程 访问同一代码,不会产生不确定的结果。

java相关集合:

Vector 、ArrayList、LinkedList

Vector和ArrayList在使用上非常相似,都可用来表示一组可变的对象的一组集合,并且可以随机的访问其中的元素。

Vector的方法都是同步的(Synchronized),是线程安全的,而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。

ArrayList和LinkedList区别:

对于处理一列数据项,Java提供了两个类ArrayList和LinkedList,ArrayList的内部实现是基于内部数组Object[],从概念上讲,它更像数组,但LinkedList的内部实现是基于一组连接的记录,它更像一个 链表 结构,所以,它们在性能上有很大的差别。

从上面的分析可知,在ArrayList的前面或中间插入数据时,你必须将其后的所有数据相应的后移,这样必然要花费更多时间,所以,当你要操作的是在一列数据的后面添加数据而不是在前面或中间并且需要随机访问其中元素时,使用ArrayList会比较好。而访问LinkedList链表中的元素时,就必须从链表一端开始沿着连接方向逐个查找,直到找到所需的元素为止,所以,当你操作的一列数据需要在前面或中间添加或删除数据并按照顺序访问元素,使用LinkedList比较好。

HashTable HashMap 、HashSet

HashTable和HashMap采用相同的存储机制,二者的实现基本一致,不同的是:

1)HashMap是非线程安全的,HashTable是线程安全的,内部的方法基本都是Synchronized

2)HashTable不允许有null值的存在,在HashTable中调用put方法时,如果key为null,直接抛出NullPointException。

HashSet:

1)HashSet基于HashMap实现,无容量限制

2)HashSet是非线程安全的

3)HashSet不保证有序

HashMap:

HashMap采用数组方式存储key,value构成的Entry对象,无容量限制。

HashMap基于Key hash查找Entry对象存放到数组的位置,对于hash冲突采用链表的方式解决。

HashMap在插入元素时可能会要扩大数组的容量,在扩大容量时需重新计算hash,并复制对象到新的数组中。

HashMap是非线程安全的,HashMap遍历使用的是Iterator

HashTable:

HashTable是线程安全的,HashTable中无论是key,还是Value都不允许为null。HashTable遍历使用的是Enumeration。

TreeSet、TreeMap:

1)TreeSet基于TreeMap实现,支持排序

2)TreeSet和TreeMap都是非线程安全的。

文章来源:智云一二三科技

文章标题:java集合(List,Set,Map)线程安全

文章地址:https://www.zhihuclub.com/173504.shtml

关于作者: 智云科技

热门文章

网站地图