精华内容
下载资源
问答
  • 同步集合

    2015-12-03 21:20:31
    HashSet、HashMap、ArrayList这些都是线程不安全的,在...所以多线程的时候要使用api提供的同步集合 ConcurrentHashMap ConcurrentHashMap, ConcurrentSkipListMap, ConcurrentSkipListSet, CopyOnWriteArraySet.

    HashSet、HashMap、ArrayList这些都是线程不安全的,在多线程并发操作的时候,会使其中的数据发生混乱。
    所以多线程的时候要使用api提供的同步集合
    ConcurrentHashMap
    ConcurrentHashMap,
    ConcurrentSkipListMap,
    ConcurrentSkipListSet,
    CopyOnWriteArraySet.

    展开全文
  • java使用同步集合,java同步集合,package cn.opackage cn.outofmemory.snippets.core;import java.util.Collections;import java.util.HashSet;import java.util.Set;public class SynchronizedSetExample { public ...

    java使用同步集合,java同步集合,package cn.opackage cn.outofmemory.snippets.core;import java.util.Collections;import java.util.HashSet;import java.util.Set;public class SynchronizedSetExample { public static void main(String[] args) { /* Please note that the same API applies to any type of Set implementation class e.g. TreeSet etc */ // Create a HashSet and populate it with elements HashSet hashSet = new HashSet(); hashSet.add("element_1"); hashSet.add("element_2"); hashSet.add("element_3"); // static void synchronizedSet(Set set) method returns a synchronized Set from HashSet Set syncSet = Collections.synchronizedSet(hashSet); System.out.println("syncSet contains : " + syncSet); }}

    输出:syncSet contains : [element_1, element_2, element_3]

    展开全文
  • 同步集合和并发集合

    2021-03-22 20:07:00
    同步集合和并发集合 同步集合类:Hashtable、Vector 方法上有同步约束 (jdk1.0) 同 步 集 合 包 装 类 : Collections.synchronizedMap(new HashMap<>()) 和Collections.synchronizedList(new ArrayList<&...

    同步集合和并发集合

    同步集合类:Hashtable、Vector 方法上有同步约束 (jdk1.0)

    同 步 集 合 包 装 类 : Collections.synchronizedMap(new HashMap<>()) 和Collections.synchronizedList(new ArrayList<>()) —使用的是全局锁

    并发集合类:ConcurrentHashMap、CopyOnWriteArrayList、CopyOnWriteHashSet
    性能比较
    同步集合比并发集合会慢得多,主要原因是锁,同步集合会对整个 Map 或 List 加锁

    并发集合的实现原理

    ConcurrentHashMap[jdk1.7]把整个 Map 划分成几个片段,只对相关的几个片段上锁,同时允许多线程访问其他未上锁的片段。CopyOnWriteArrayList 允许多个线程以非同步的方式读,当有线程写的时候它会将整个List 复制一个副本给它。如果在读多写少这种对并发集合有利的条件下使用并发集合,这会比使用同步集合更具有可伸缩性。
    并发集合的使用建议一般不需要多线程的情况,只用到 HashMap、ArrayList,只要真正用到多线程的时候就一定要考虑同步。所以这时候才需要考虑同步集合或并发集合。
    解决方法 1: 给整个集合上添加一个锁

     List<Integer> list=Collections.synchronizedList(new ArrayList<>());
    

    解决方法 2:适用于读多写少的场景下

     List<Integer> list=new CopyOnWriteArrayList<>();
    

    ConcurrentHashMap 实现原理
    ConcurrentHashMap (JDK1.7) 是由 Segment 数组结构和 HashEntry 数组结构组成。Segment 是一种可重入锁 ReentrantLock,在 ConcurrentHashMap 里扮演锁的角色,HashEntry 则用于存储键值对数据。
    一个 ConcurrentHashMap 里包含一个 Segment 数组,Segment 的结构和 HashMap 类似,是一种数组和链表结构,一个 Segment 里包含一个 HashEntry 数组,每个 HashEntry是一个链表结构的元素, 每个 Segment 守护者一个 HashEntry 数组里的元素,当对HashEntry 数组的数据进行修改时,必须首先获得它对应的 Segment 锁。
    在这里插入图片描述
    JDK1.7 版本的 CurrentHashMap 的实现原理
    在 JDK1.7 中 ConcurrentHashMap 采用了【数组+Segment 分段锁】的方式实现。

    • Segment(分段锁) ConcurrentHashMap 中的分段锁称为 Segment,它即类似于
      HashMap 的结构,即内部拥有一个 Entry 数组,数组中的每个元素又是一个链表,同时又是一个 ReentrantLock(Segment 继承了 ReentrantLock)。
    • 内部结构。 ConcurrentHashMap 使用分段锁技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问,能够实现真正的并发访问。ConcurrentHashMap 定位一个元素的过程需要进行两次 Hash 操作。第一次 Hash 定位到 Segment,第二次 Hash 定位到元素所在的链表的头部。

    坏处: 这一种结构的带来的副作用是 Hash 的过程要比普通的 HashMap 要长
    好处: 写操作的时候可以只对元素所在的 Segment 进行加锁即可,不会影响到其他的Segment,这样,在最理想的情况下,ConcurrentHashMap 可以最高同时支持 Segment数量大小的写操作(刚好这些写操作都非常平均地分布在所有的 Segment 上)。所以通过这种结构,ConcurrentHashMap 的并发能力可以大大的提高。
    在这里插入图片描述
    JDK8 中 ConcurrentHashMap 采用了【数组+链表+红黑树】的实现方式来设计,内部大量采用 CAS 操作。
    JDK8 中彻底放弃了 Segment 转而采用的是 Node,其设计思想也不再是 JDK1.7 中的分段锁思想。
    Node:保存 key,value 及 key 的 hash 值的数据结构。其中 value 和 next 都用 volatile修饰,保证并发的可见性。
    在 JDK8 中 ConcurrentHashMap 的结构,由于引入了红黑树,使得 ConcurrentHashMap的实现非常复杂,红黑树是一种性能非常好的二叉查找树,其查找性能为 O(log2N),但是其实现过程也非常复杂,而且可读性也非常差,早期完全采用链表结构时 Map 的查找时间复杂度为 O(N),JDK8 中 ConcurrentHashMap 在链表的长度大于某个阈值的时候会将链表转换成红黑树进一步提高其查找性能。

    CAS 是 compare and swap 的缩写,即比较交换。cas 是一种基于锁的操作,而且是乐观锁。在 java 中锁分为乐观锁和悲观锁。悲观锁是将资源锁住,等一个之前获得锁的线程释放锁之后,下一个线程才可以访问。而乐观锁采取了一种宽泛的态度,通过某种方式不加锁来处理资源,比如通过给记录加 version 来获取数据,性能较悲观锁有很大的提高。

    CAS 操作包含三个操作数 —— 内存位置 V、预期原值 A 和新值 B。如果内存地址里面的值和 A 的值是一样的,那么就将内存里面的值更新成 B。CAS 是通过无限循环来获取数据的,若果在第一轮循环中,a 线程获取地址里面的值被 b 线程修改了,那么 a 线程需要自旋,到下次循环才有可能机会执行。

    CopyOnWrite 容器
    CopyOnWrite 容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行 Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对 CopyOnWrite 容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。
    所以 CopyOnWrite 容器也是一种读写分离的思想,读和写不同的容器。

    CopyOnWriteArrayList 的实现原理
    可以发现在添加的时候是需要加锁的,否则多线程写的时候会 Copy 出 N 个副本出来。读的时候不需要加锁,如果读的时候有多个线程正在向 ArrayList 添加数据,读还是会读到旧的数据,因为写的时候不会锁住旧的 ArrayList。

    CopyOnWrite 的应用场景
    CopyOnWrite 并发容器用于读多写少的并发场景。
    比如白名单,黑名单,商品类目的访问和更新场景,假如我们有一个搜索网站,用户在这个网站的搜索框中,输入关键字搜索内容,但是某些关键字不允许被搜索。这些不能被搜索的关键字会被放在一个黑名单当中,黑名单每天晚上更新一次。当用户搜索时,会检查当前关键字在不在黑名单当中,如果在,则提示不能搜索。

    CopyOnWrite 的缺点
    1、内存占用问题。因为 CopyOnWrite 的写时复制机制,所以在进行写操作的时候,内存里会同时驻扎两个对象的内存,旧的对象和新写入的对象(注意:在复制的时候只是复制容器里的引用,只是在写的时候会创建新对象添加到新容器里,而旧容器的对象还在使用,所以有两份对象内存)。如果这些对象占用的内存比较大,比如说 200M 左右,那么再写入100M 数据进去,内存就会占用 300M,那么这个时候很有可能造成频繁的 Yong GC 和 Full GC。系统中使用了一个服务由于每晚使用 CopyOnWrite 机制更新大对象,造成了每晚 15秒的 Full GC,应用响应时间也随之变长。针对内存占用问题,可以通过压缩容器中的元素的方法来少大对象的内存消耗,如果元素全是 10 进制的数字,可以考虑把它压缩成 36 进制或 64 进制。或者不使用 CopyOnWrite容器,而使用其他的并发容器,如 ConcurrentHashMap。

    2、数据一致性问题。CopyOnWrite 容器只能保证数据的最终一致性,不能保证数据的实时一致性。所以如果你希望写入的的数据,马上能读到,请不要使用 CopyOnWrite 容器。

    展开全文
  • 同步集合下有两大接口,一为Collection接口,二为Map接口 List,Set两个接口继承了Collection 集合实现类框架总结 **List:**存储任意类型的对象,有序,有下标,元素可以重复。 ArrayList 特点:Object[]数组实现...

    集合简介

    集合

    什么是集合?

    • 集合是一种工具类,一种容器,可以用于存储数量不等的多个对象,代替数组。所有关于集合的接口和相关实现类都在java.uitl包下
    • 同步集合下有两大接口,一为Collection接口,二为Map接口
    • List,Set两个接口继承了Collection

    集合实现类框架总结

    List:存储任意类型的对象,有序,有下标,元素可以重复。

    • ArrayList

      特点:Object[]数组实现,查询快,增删慢,线程不安全,效率高。

    • Vector

      特点:Object[]数组实现,查询快,增删慢,线程安全,效率低。

    • LinkedList

      特点:链表实现,查询慢,增删快,线程不安全,效率高。

      备注:为双向链表实现;JDK1.6之前为循环链表,JDK1.7取消了循环

    Set:用于存储任意的Object对象,无序,无下表,元素内容不可重复。

    • HashSet

      特点:基于HashMap实现。依赖与hashCode()和equals()实现唯一性。

    • LinkedHashSet

      特点:基于链表+HashMap实现,保证了唯一性和顺序性

    • TreeSet

      特点:红黑树(属于自平衡的排序二叉树)

    Map:用于存储任意的键值对(key-value),键:无序无下标,元素唯一;值:无序,无下标,元素可以重复

    • HashMap

      特点:线程不安全,效率高,允许使用null作为key或value

      备注:JDK1.8之前HashMap由数组+链表组成,JDK1.8以后,数组+链表+红黑树。

    • LinkedHashMap

      特点:在HashMap的基础上维持了添加到集合中的顺序

    • HashTable

      特点:线程安全,效率低;不允许null作为key或value

    • TreeMap

      特点:SortedMap(Map的子接口)的实现类,红黑树(自平衡的排序二叉树)

      备注:如果key是自定义类型的对象,需要实现Comparable接口覆盖compareTo()方法指定排序规则

    同步集合

    什么是同步集合?

    JDK1.0版本推出。可以理解为在普通集合的基础上加synchoronized来实现同步的集合。但这个锁机制的粒度太粗,当集合变得非常大时,由于锁机制的粒度太粗会导致性能降低。建议使用并发集合

    • HashTable
    • Vector
    • Stack
    • 包装类Collections.synchronizedMap()和Collections.synchronizedList()

    在Collections工具类中有如下几个方法:

    synchronizedCollection(Collection<T> t)
    synchronizedList(List<T> list)
    synchronizedMap(Map<K,V> map)
    synchronizedSet(Set<T> t)
    

    上面几个方法可以将普通集合编程同步集合,从而解决集合的线程安全问题。但效率非常低,需要线程安全的集合类型可以考虑使用JUC包下的并发集合。

    并发集合

    JDK1.5推出的并发集合用于解决在并发情况下线程安全的集合使用。由于采用了锁分离和内部分区等技术提高了可扩展性。位于java.uitl.concurrent包下。

    接口

    • Queue接口

      特点:Collection的子接口,JDK5.0出现,用来模拟队列数据结构

      实现类:LinkedList、LinkedBlockingQueue等

    • BlockingQueue

      特点:Queue的子接口,阻塞队列,增加了两个线程状态为无限期等待的方法。

    实现类

    • ConcurrentHashMap

      特点:基于HashMap+锁实现线程安全,Map集合的实现类。

      备注:JDK7.0以前采用分段锁,缩小了对象的范围,从而减少锁冲突的可能性,从而提高系统的并发能力。JDK8.0推翻了分段锁的实现,而是采用了CAS +synchronized来实现更高效的安全保证。

    • CopyOnWriteArrayList

      特点:基于ArrayList+读操作无锁+写操作加锁实现线程安全,List集合的实现类。

      备注:写操作,先拷贝一个副文本,在副文本的基础上进行写操作,最后新文本代替旧文本。

      使用场景:由于牺牲了写操作换取读操作的效率,所以适用于读操作远远大于写操作的场景。

    • ArrayBlockingQueue

      特点:数组队列实现,有界队列(手工的控制上限),BlockQueue接口的实现类。

      备注:Queue接口继承了Collection,用来模拟队列数据结构(FIFO)。

    • LinkedBlockingQueue

      特点:链表结构实现,无界队列,读写各用一把锁,BlockingQueue接口的实现类。

      使用场景:在高并发情况读写操作都多时,性能优于ArrayBlockingQueue

    • ConcurrentLinkedQueue

      特点:采用CAS算法,无锁并且线程安全。

      备注:位于java.util. ConcurrentLinkedQueue包下,Queue的实现类基于链表实现的队列。

    展开全文
  • 同步集合与并发集合

    2019-10-03 20:44:32
    同步集合:可以简单地理解为通过synchronized实现同步的集合。如果有多个线程调用同步集合的方法,它们将会串行执行;ArrayList、Vector与Stack:1.Vector是线程安全的,源码中有很多的synchronized可以看出,而...
  • 同步集合和并发集合的区别在于性能和可扩展性,以及他们如何实现线程安全 同步集合类 HashTable Vector 同步集合包装类:Collections.synchronizedMap Collections.synchronizedList 其中HashTable相当于加了...
  • 并发集合 VS 同步集合

    千次阅读 2018-02-28 10:51:55
    并发集合: ConcurrentHashMap CopyOnWriteArrayList CopyOnWriteArraySet ... 同步集合器Collections.synchronizedList(list)、Collections.synchronizedSet(set)、Collections.synchronizedMap(m...
  • Java多线程之同步集合和并发集合 不管是同步集合还是并发集合他们都支持线程安全,他们之间主要的区别体现在性能和可扩展性,还有他们如何实现的线程安全。 同步集合类 Hashtable Vector 同步集合包装类,...
  • 并发编程-同步集合和并发集合java并发编程volatile互斥锁sychronized公平锁/非公平锁可重入锁独享锁/共享锁乐观锁/悲观锁偏向锁/轻量级锁/重量级锁自旋锁锁消除同步集合和并发集合性能比较并发集合的实现原理并发...
  • 同步集合类 Hashtable Vector 同步集合包装类,Collections.synchronizedMap()和Collections.synchronizedList() 并发集合类 ConcurrentHashMap CopyOnWriteArrayList CopyOnWriteHashSet 性能 同步集合比并发集合...
  • 并发编程-同步集合和并发集合java并发编程volatile互斥锁sychronized公平锁/非公平锁可重入锁独享锁/共享锁乐观锁/悲观锁偏向锁/轻量级锁/重量级锁自旋锁锁消除同步集合和并发集合性能比较并发集合的实现原理并发...
  • 同步集合可以简单地理解为**通过synchronized来实现同步的集合。**如果有多个线程调用同步集合的方法,它们将会串行执行。 arrayList 和 vector、stack: Vector是线程安全的,源码中有很多的synchronized可以看出...
  • java多线程中并发集合和同步集合有哪些? Java多线程之同步集合和并发集合 另一个介绍 hashmap 是非同步的,故在多线程中是线程不安全的,不过也可以使用 同步类来进行包装: 包装类Collections.synchronizedMap()...
  • Java多线程:同步集合与同步锁

    千次阅读 2018-10-14 21:58:34
    Java多线程:同步集合与同步锁 同步集合 同步集合在多线程开发中扮演非常重要的角色,本文介绍些常用但被忽略的同步集合。 CopyOnWriteArrayList Copy-On-Write是一种用于程序设计中的优化策略,基本思路是多个线程...
  • 同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合,不过并发集合的可扩展性更高。 在Java1.5之前程序员们只有同步集合来用且在多线程并发的时候会导致争用,阻碍了系统的扩展性。 Java5介绍了并发...
  • 在Java中,有普通集合、同步的集合(即线程安全的集合)、并发集合。 并发集合常见的有ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentLinkedDeque等。...如果有多个线程调用同步集合的方法,它们...
  • 同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合,不过并发集合的可扩展性更高。 在Java1.5之前程序员们只有同步集合来用且在多线程并发的时候会导致争用,阻碍了系统的扩展性。Java5介绍了并发集合...
  • 同步集合可以简单地理解为通过synchronized来实现同步的集合。如果有多个线程调用同步集合的方法,它们将会串行执行。 arrayList和vector、stack: 1. Vector是线程安全的,源码中有很多的synchronized可以看出,而...
  • Java中的同步集合

    2019-08-10 16:31:10
    List list = Collections.synchronizedList(new ArrayList(...)); synchronized(list){ ...以上是Java中同步集合的使用,同步集合的缺点很明显,就是不高效。 具体看实现我们发现只是用装饰者模式...
  • 工具类方法   static &lt;T&gt; Collection&...  返回指定 collection 支持的同步(线程安全的)collection。 static &lt;T&gt; List&lt;T&gt; ...
  • 转载出处:... 同步集合可以简单地理解为通过synchronized来实现同步的集合。如果有多个线程调用同步集合的方法,它们将会串行执行。 arrayList和vector、stack Vecto...
  • 同步集合 1.传统集合类在并发访问时的问题说明。 2.传统方式下用Collections工具类提供的synchronzedCollection方法来获得同步集合,分析该方法的实现源码。  得到的同步集合,是在操作集合的增删改方法加了锁,不...
  • 同步集合类 java多线程
  • package demo.thread; import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks....class 给非同步集合加锁 { public static void main(String[] args) { List list = new ArrayLi

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,006
精华内容 4,002
关键字:

同步集合