风也温柔

计算机科学知识库

java集合哪些是安全的 Java的多线程之线程安全的集合

  1、线程安全的集合java

  若是多线程要并发地修改一个数据结构,例如散列表,那么很容易会破坏这个数据结构。例如,一个线程可能要向表中插入一个新元素。加入在调整散列表各个桶之间的连接关系的过程当中,被剥夺了控制权。若是另外一个线程也开始遍历同一个链表,可能使无效的连接并形成混乱,会抛出异常或陷入死循环。算法

  能够经过提供锁来保护共享数据结构,可是选择线程安全的实现做为替代可能更容易些。阻塞队列就是线程安全的集合。数组

  1>高效的映射表、集合和队列安全

  java.util.包提供了映射表、有序表和队列的高效实现:、p、t和e。数据结构

  java集合哪些是安全的_a集合减去b集合 java_java中线程安全的集合

  这些集合使用复杂的算法,经过容许并发地访问数据结构的不一样部分来使竞争极小化。多线程

  与大多数集合不一样,size方法没必要再常量时间内操做。肯定这样的集合当前的大小一般须要遍历。并发

  集合返回弱一致性的迭代器。这意味着迭代器不必定能反映出它们被构造以后的全部的修改,可是,它们不会被同一值返回两次,也不会抛出异常。性能

  java中线程安全的集合_a集合减去b集合 java_java集合哪些是安全的

  注:与之造成对照的是,集合若是在迭代器构造以后发生改变,java.util包中的迭代器将抛出异常。spa

  并发的散列映射表java集合哪些是安全的,可高效地支持大量的读者和必定数量的写者。默认状况下,假定能够有多达16个写者线程同时执行。能够有更多的写者线程,可是,若是同一时间多于16个,其余线程将暂时被阻塞。能够指定更大数目的构造器,然而,恐怕没有这种必要。线程

  2>写数组的拷贝

  和是线程安全的集合,其中全部的修改线程对底层数组进行复制。若是在集合上进行迭代的线程数超过修改线程数,这样的安排是颇有用的。当构建一个迭代器的时候,它包含一个对当前数组的引用。若是数组后来被修改了,迭代器仍然引用旧数组,可是,集合的数组已经被替换了。所以,旧的迭代器拥有一致的试图,访问它无须任何同步开销。

  3>较早的线程安全集合

  从Java的初始版本开始,和类就提供了线程安全的动态数组和散列表的实现。如今这些类被弃用了,取而代之的是和类。这些类不是线程安全的,而集合库中提供了不一样的机制。任何集合类经过使用同步包装器变成线程安全的:

  <pre>List synchArrayList = Collections.synchronizedList(new ArrayList());
Map synchHashMap = Collections.synchronizedMap(new HashMap());</pre>

  结果集合的方法使用锁加以保护java集合哪些是安全的,提供了线程的安全访问。

  应该确保没有任何线程经过原始的非同步方法访问数据结构。最便利的方法是确保不保存任何指向原始对象的引用java集合哪些是安全的 Java的多线程之线程安全的集合,简单地构造一个集合并当即传递给包装器。

  若是在另外一个线程可能进行修改时要对集合进行迭代,仍然须要使用“客户端”锁定:

  <pre>synchronized (synchHashMap) {

        Iterator iter = synchHashMap.keySet().iterator();
    }</pre>

  若是使用循环必须使用一样代码,由于循环使用了迭代器。

  注:若是迭代过程当中,别的线程修改集合,迭代器会失效,抛出异常。同步仍然是须要的,所以并发的修改能够被可靠地检查出来。 最好使用java.util.包中定义的集合,不适用同步包装器中的。特别是,加入他们访问的是不一样的桶,因为已经精心地实现了,多线程能够访问它们并且不会彼此阻塞。有一个例外是常常被修改的数组列表。在那种状况下,同步的能够赛过。

  注:与的比较?

  相同点: 和 都是线程安全的,能够在多线程环境中运行; key跟value都不能是null 区别: 二者主要是性能上的差别,的全部操做都会锁住整个对象,虽然可以保证线程安全,可是性能较差; 内部使用数组,每一个相似于,在“写”线程或者部分特殊的“读”线程中锁住的是某个对象,其它的线程可以并发执行其它的对象。

  文章来源:http://www.noobyard.com/article/p-qzrpyfgk-mg.html