精华内容
下载资源
问答
  • 线程安全:就是当多线程访问时,采用了加锁的机制;即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读取完之后,其他线程才可以使用。防止出现数据不一致或者数据被污染...

    一、概念:

    • 线程安全:就是当多线程访问时,采用了加锁的机制;即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读取完之后,其他线程才可以使用。防止出现数据不一致或者数据被污染的情况。
    • 线程不安全:就是不提供数据访问时的数据保护,多个线程能够同时操作某个数据,从而出现数据不一致或者数据污染的情况。
    • 对于线程不安全的问题,一般会使用synchronized关键字加锁同步控制。
    • 线程安全 工作原理: jvm中有一个main memory对象,每一个线程也有自己的working memory,一个线程对于一个变量variable进行操作的时候, 都需要在自己的working memory里创建一个copy,操作完之后再写入main memory。 
      当多个线程操作同一个变量variable,就可能出现不可预知的结果。 
      而用synchronized的关键是建立一个监控monitor,这个monitor可以是要修改的变量,也可以是其他自己认为合适的对象(方法),然后通过给这个monitor加锁来实现线程安全,每个线程在获得这个锁之后,要执行完加载load到working memory 到 use && 指派assign 到 存储store 再到 main memory的过程。才会释放它得到的锁。这样就实现了所谓的线程安全。

    二、线程安全(Thread-safe)的集合对象:

    • Vector 线程安全:
    • HashTable 线程安全:
    • StringBuffer 线程安全:

    三、非线程安全的集合对象:

    • ArrayList
    展开全文
  • Java线程安全集合详解

    万次阅读 多人点赞 2018-03-25 18:52:32
    一、早期线程安全集合我们先从早期的线程安全集合说起,它们是Vector和HashTable1.VectorVector和ArrayList类似,是长度可变的数组,与ArrayList不同的是,Vector是线程安全的,它给几乎所有的public方法都加上...

    一、早期线程安全的集合

    我们先从早期的线程安全的集合说起,它们是Vector和HashTable

    1.Vector

    Vector和ArrayList类似,是长度可变的数组,与ArrayList不同的是,Vector是线程安全的,它给几乎所有的public方法都加上了synchronized关键字。由于加锁导致性能降低,在不需要并发访问同一对象时,这种强制性的同步机制就显得多余,所以现在Vector已被弃用

    2.HashTable

    HashTable和HashMap类似,不同点是HashTable是线程安全的,它给几乎所有public方法都加上了synchronized关键字,还有一个不同点是HashTable的K,V都不能是null,但HashMap可以,它现在也因为性能原因被弃用了

    二、Collections包装方法

    Vector和HashTable被弃用后,它们被ArrayList和HashMap代替,但它们不是线程安全的,所以Collections工具类中提供了相应的包装方法把它们包装成线程安全的集合

    List<E> synArrayList = Collections.synchronizedList(new ArrayList<E>());
    
    Set<E> synHashSet = Collections.synchronizedSet(new HashSet<E>());
    
    Map<K,V> synHashMap = Collections.synchronizedMap(new HashMap<K,V>());
    
    ...

    Collections针对每种集合都声明了一个线程安全的包装类,在原集合的基础上添加了锁对象,集合中的每个方法都通过这个锁对象实现同步

    三、java.util.concurrent包中的集合

    1.ConcurrentHashMap

    ConcurrentHashMap和HashTable都是线程安全的集合,它们的不同主要是加锁粒度上的不同。HashTable的加锁方法是给每个方法加上synchronized关键字,这样锁住的是整个Table对象。而ConcurrentHashMap是更细粒度的加锁
    在JDK1.8之前,ConcurrentHashMap加的是分段锁,也就是Segment锁,每个Segment含有整个table的一部分,这样不同分段之间的并发操作就互不影响
    JDK1.8对此做了进一步的改进,它取消了Segment字段,直接在table元素上加锁,实现对每一行进行加锁,进一步减小了并发冲突的概率

    2.CopyOnWriteArrayList和CopyOnWriteArraySet

    它们是加了写锁的ArrayList和ArraySet,锁住的是整个对象,但读操作可以并发执行

    3.

    除此之外还有ConcurrentSkipListMap、ConcurrentSkipListSet、ConcurrentLinkedQueue、ConcurrentLinkedDeque等,至于为什么没有ConcurrentArrayList,原因是无法设计一个通用的而且可以规避ArrayList的并发瓶颈的线程安全的集合类,只能锁住整个list,这用Collections里的包装类就能办到

    展开全文
  • Java多线程线程安全和非线程安全集合对象

    万次阅读 多人点赞 2017-01-19 12:03:58
    线程安全:就是当多线程访问时,采用了加锁的机制;即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读取完之后,其他线程才可以使用。防止出现数据不一致或者数据被污染...

    一、概念:

    • 线程安全:就是当多线程访问时,采用了加锁的机制;即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读取完之后,其他线程才可以使用。防止出现数据不一致或者数据被污染的情况。
    • 线程不安全:就是不提供数据访问时的数据保护,多个线程能够同时操作某个数据,从而出现数据不一致或者数据污染的情况。
    • 对于线程不安全的问题,一般会使用synchronized关键字加锁同步控制。
    • 线程安全 工作原理: jvm中有一个main memory对象,每一个线程也有自己的working memory,一个线程对于一个变量variable进行操作的时候, 都需要在自己的working memory里创建一个copy,操作完之后再写入main memory。
      当多个线程操作同一个变量variable,就可能出现不可预知的结果。
      而用synchronized的关键是建立一个监控monitor,这个monitor可以是要修改的变量,也可以是其他自己认为合适的对象(方法),然后通过给这个monitor加锁来实现线程安全,每个线程在获得这个锁之后,要执行完加载load到working memory 到 use && 指派assign 到 存储store 再到 main memory的过程。才会释放它得到的锁。这样就实现了所谓的线程安全。

    二、线程安全(Thread-safe)的集合对象:

    • Vector 线程安全:
    • HashTable 线程安全:
    • StringBuffer 线程安全:

    三、非线程安全的集合对象:

    • ArrayList :
    • LinkedList:
    • HashMap:
    • HashSet:
    • TreeMap:
    • TreeSet:
    • StringBulider:

    四、相关集合对象比较:

    • Vector、ArrayList、LinkedList:
      1、Vector:
      Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。
      2、ArrayList:
      a. 当操作是在一列数据的后面添加数据而不是在前面或者中间,并需要随机地访问其中的元素时,使用ArrayList性能比较好。
      b. ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
      3、LinkedList:
      a. 当对一列数据的前面或者中间执行添加或者删除操作时,并且按照顺序访问其中的元素时,要使用LinkedList。
      b. LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。

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

    ArryList和LinkedList的区别:
    在处理一列数据项时,Java提供了两个类ArrayList和LinkedList,ArrayList的内部实现是基于内部数组Object[],所以从概念上说它更像数组;然而LinkedList的内部实现是基于一组连接的记录,所以,它更像一个链表结构;所以它们在性能上有很大的差别。
    由上可知,在ArrayList的前面或者中间插入数据的时候,必须将其后的所有数据相应的后移,这样要花费较多的时间;所以,当操作是在一列数据的后面添加数据而不是在前面或者中间,并需要随机地访问其中的元素时,使用ArrayList性能比较好。
    然而访问链表中的某个元素的时候,就必须从链表的一端开始,沿着连接的方向一个一个元素的去查找,直到找到所需的元素为止,所以,当对一列数据的前面或者中间执行添加或者删除操作时,并且按照顺序访问其中的元素时,要使用LinkedList。
    如果在实际的操作中,前面两种情况交替出现,可以考虑使用List这样的通用接口,而不用关心具体的实现,再具体的情况下,它的性能由具体的实现来保证。

    • HashTable、HashMap、HashSet:
      HashTable和HashMap采用的存储机制是一样的,不同的是:
      1、HashMap:
      a. 采用数组方式存储key-value构成的Entry对象,无容量限制;
      b. 基于key hash查找Entry对象存放到数组的位置,对于hash冲突采用链表的方式去解决;
      c. 在插入元素时,可能会扩大数组的容量,在扩大容量时须要重新计算hash,并复制对象到新的数组中;
      d. 是非线程安全的;
      e. 遍历使用的是Iterator迭代器;

      2、HashTable:
      a. 是线程安全的;
      b. 无论是key还是value都不允许有null值的存在;在HashTable中调用Put方法时,如果key为null,直接抛出NullPointerException异常;
      c. 遍历使用的是Enumeration列举;

      3、HashSet:
      a. 基于HashMap实现,无容量限制;
      b. 是非线程安全的;
      c. 不保证数据的有序;

    • TreeSet、TreeMap:
      TreeSet和TreeMap都是完全基于Map来实现的,并且都不支持get(index)来获取指定位置的元素,需要遍历来获取。另外,TreeSet还提供了一些排序方面的支持,例如传入Comparator实现、descendingSet以及descendingIterator等。
      1、TreeSet:
      a. 基于TreeMap实现的,支持排序;
      b. 是非线程安全的;

      2、TreeMap:
      a. 典型的基于红黑树的Map实现,因此它要求一定要有key比较的方法,要么传入Comparator比较器实现,要么key对象实现Comparator接口;
      b. 是非线程安全的;

    • StringBuffer和StringBulider:
      StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串。

    1、在执行速度方面的比较:StringBuilder > StringBuffer ;
    2、StringBuffer与StringBuilder,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,不像String一样创建一些对象进行操作,所以速度就快了;
    3、 StringBuilder:线程非安全的;
    4、StringBuffer:线程安全的;
     
    对于String、StringBuffer和StringBulider三者使用的总结:
    1.如果要操作少量的数据用 = String
    2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
    3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

    展开全文
  • 集合大概有4种类型:List Set Queue Map 其中Vector、HashTable、Properties是线程安全...(线程安全是指:当多个线程访问同一个集合或Map时,如果有超过一个线程修改了ArrayList集合,则程序必须手动保证该集合的同

    集合大概有4种类型:List   Set   Queue  Map

    其中Vector、HashTable、Properties是线程安全的。其中ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等都是线程不安全的。(线程不安全是指:当多个线程访问同一个集合或Map时,如果有超过一个线程修改了ArrayList集合,则程序必须手动保证该集合的同步性。)

    当多个并发同时对非线程安全的集合进行增删改的时候会破坏这些集合的数据完整性

    Collections提供的类方法把这些集合包装成线程安全的集合。Collections提供了如下几个静态方法。
    • <T> Collection<T> synchronizedCollection(Collection<T> c): 返回指定collection 对应的线程安全的collection。
    • static <T> List<T> synchronizedList(List<T> list): 返回指定List对象对应的线程安全的List 对象。
    • static <K, V> Map<K, V> synchronizedMap(Map<K, V> m): 返回指定Map对象对应的线程安全的Map对象。
    • static <T> Set<T> synchronizedSet(Set<T> s): 返回指定Set对象对应的线程安全的Set对象。
    • static <K, V> SortedMap<K, V> synchronizedSortedMap(SortedMap<K, V> m): 返回指定SortedMap对象对应的线程安全的SortedMap对象。
    • static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s): 返回指定SortedSet对象对应的线程安全的SortedSet对象。

    另外 java.util.concurrent 包下提供了大量支持高效并发访问的集合接口和实现类:
    • 以Concurrent 开头的集合类,如ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、ConcurrentLinkedQueue 和 ConcurrentLinkedDeque。
    • 以CopyOnWrite 开头的集合类,如CopyOnWriteArrayList、CopyOnWriteArraySet。




    展开全文
  • 线程处理list集合参考

    千次阅读 2019-06-25 22:10:20
    线程处理list集合参考 https://blog.csdn.net/weixin_38158701/article/details/84966713 https://blog.csdn.net/sinat_38364990/article/details/81170003 ... ...
  • Java 集合框架分析:线程安全集合

    千次阅读 2016-10-04 18:44:19
    线程安全集合什么是线程安全在多线程环境下,不会产生不一致的行为(线程安全:有一定的标准,能够断定发生的先后顺序,如先获得锁的会执行,然后….)分类1.Copy* CopyOnWriteArraySet,CopyOnWriteArrayLis
  • 【Java多线程线程安全集合

    千次阅读 2020-10-18 21:56:28
    线程安全集合 Vector Vector集合是对ArrayList集合线程安全的实现,它们两者在方法的实现上没有什么太大的区别,最大的区别就是,Vector在方法前面加上了synchronized关键字,用于保证线程安全。 【Java集合框架...
  • 线程处理List集合

    2020-06-30 11:52:30
    假如你的需求要处理一个很大的集合,并且处理时间希望越开越好。正常你就是启动一个方式,以单线程的方式慢慢处理。下面 我会编写一个多线程方案改善你的代码。 实施方案 将集合拆分成多个子集合,数据分片 ...
  • Java中常用集合&线程安全集合

    千次阅读 2020-09-25 17:42:28
    线程安全List ArrayList和LinkedList都不是线程安全的,在多线程环境下存在线程安全问题。 1.Vector Vector通过在方法上加上synchronized关键字修饰来实现线程安全,但Vector的线程安全仅限于单个操作,多个操作并...
  • 通过Collections将集合转换为线程安全集合
  • C# 线程安全集合

    千次阅读 2019-07-05 11:56:01
    从.Net 4.0框架开始,在System.Collections.Concurrent命名空间下,增加了用于多线程协同的并发集合类(线程安全集合)。 线程安全集合: 就是当多线程访问时,采用了加锁的机制;即当一个线程访问集合时,会对这个...
  • C#线程安全集合

    2020-06-15 18:17:48
    表示对象的线程安全的无序集合。 static void Main(string[] args) { ConcurrentBag<int> thList = new ConcurrentBag<int>(); Parallel.For(0, 100000, a => { thList.Add(a); }); thList....
  • 如何实现 List 集合线程安全

    千次阅读 2019-09-29 10:03:29
    在实际项目开发中,List 集合较为常用,相比于数组,其提供了更多的方法,便于遍历、搜索、添加与移除。常见的有 ArrayList、Vector等。  关于ArrayList  中所周知,ArrayList不是线程安全的,在多线程开发时,...
  • Java多线程安全集合

    2017-03-17 10:24:42
    Java的多种多线程安全集合的介绍和示例代码
  • 在多线程中,如果要并发的修改一个数据结构,那么很有可能会破坏这个数据结构。例如,一个线程可能要向一个散列表中插入一个元素,假如在调整各个桶之间的链接...任何集合类都可以通过使用同步包装器变成线程安全的:
  • 线程安全集合: HashTable、ConcurrentHashMap,Vector、Properties 注意: 其他线程安全集合也可以使Collections工具类把它们包装成线程安全集合 如:List synArrayList = Collections.synchronizedList...
  • Java的多线程线程安全集合

    万次阅读 2016-02-15 18:18:34
    一、线程安全集合  如果多线程要并发地修改一个数据结构,例如散列表,那么很容易会破坏这个数据结构。例如,一个线程可能要向表中插入一个新元素。加入在调整散列表各个桶之间的链接关系的过程中,被剥夺了控制...
  • 一、线程安全集合  Java中有很多支持多线程并发的集合,比如Hashtable、Vector但是这些“古老”的并发集合效率并不高,一般只支持一个线程对其进行读写(加锁是针对整张表)。从Java 5开始 Java在java.util....
  • 黑猴子的家:Scala 线程安全集合

    千次阅读 2019-06-01 21:53:00
    所有线程安全集合都是以Synchronized开头的集合,例如 SynchronizedBuffer SynchronizedMap SynchronizedPriorityQueue SynchronizedQueue SynchronizedSet SynchronizedStack 非线程安全集合,在多线程操作...
  • 我们都知道ArrayList并不是现成安全集合,那怎么操作将之变成线程安全集合呢?jdk的Collections类提供了一些Collection.synchronized*的方法。如: public static &lt;T&gt; Collection&lt;T&...
  • 线程安全List集合(性能比较差..)

    万次阅读 2015-02-09 16:46:17
    由于MS没有提供List线程安全集合.自己动手写了一个,不过性能…不高..对于性能要求不高的情况下可以使用.using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace System...
  • 线程安全集合

    千次阅读 2009-09-13 23:21:00
    线程安全集合简介JDK 1.2 中引入的 Collection 框架是一种表示对象集合的高度灵活的框架,它使用基本接口 List、Set 和 Map。通过 JDK 提供每个集合的多次实现(HashMap、Hashtable、TreeMap、WeakHashMap、HashSet...
  • 线程分段处理List集合

    千次阅读 2017-08-29 22:07:36
    场景:大数据量List集合,...解决方案:考虑到效率问题,对List集合分段,动态创建线程池线程条数,完成数据对比操作,代码如下:public static void main(String[] args) throws Exception { // 开始时间 long start = Syst
  • java中提供了丰富的集合类操作,大概可以分为无序结合Set,有序集合List和无序键值对集合Map。Java5之后又新增了队列操作集合Queue。Java1.5之后新增了线程安全集合操作类,阻止在java.util.concurrent包中。本文...
  • java中哪些集合线程安全的,哪些是线程安全

    万次阅读 多人点赞 2019-05-09 11:41:42
    线程安全线程安全集合3. 如何综合考虑线程安全和效率低的问题 1. 常见集合 这里自己总结了一些比较常见的java集合,对于这些集合的特点和区别后期博客中会进行总结介绍: 2.什么叫“集合线程安全的” ...
  • 线程安全List

    千次阅读 2019-09-26 22:05:54
    那么我想要一个线程安全集合要怎么办呢? 我们在基础阶段就有学过ArrayList和Vector的区别。但是你只说出Vector会让面试官鄙视的,除了Vector,你还会别的吗? 除了Vector,还有: java.util.Collections....
  • (1)支持多线程并发读取(get/遍历),只支持单线程写入(add,remove); (2)当有修改操作发生时,会对原有的数组进行拷贝,拷贝出一个新的数组,修改操作在新的数组上发生,修改加锁。原有数组的查询操作不需要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 227,437
精华内容 90,974
关键字:

线程安全的list集合