一 同步类容器同步类容器都是线程安全的,但在某些场景中可能需要加锁来保证复合操作. 符合操作如:迭代(反复访问元素,遍历完容器中所有元素).跳转(根据指定的顺序找到当前元素的下一个元素).条件运算.这些复合操作在多线程并发地修改容器时,可能会表现出意外的行为,最经典的ConcurrentModificationException,原因是当前容器迭代的过程中,被并发的修改了内容,这是由于早期迭代器设计的时候没有考虑到并发修改. 同步类容器:如古老的Vector.HashTable.这些容器的同步…
同步容器类 早期版本的JDK提供的同步容器类为Vector和Hashtable,JDK1.2 提供了Collections.synchronizedXxx等工程方法,将普通的容器继续包装.对每个共有方法都进行同步. Collection类中提供了多个synchronizedXxx方法,该方法返回指定集合对象对应的同步对象.synchronizedXxx方法本质是对相应容器的包装. 例:使用Collections类获得同步容器. public static void main(String[] a…
并发类容器: jdk5.0以后提供了多种并发类容器来替代同步类容器从而改善性能. 同步类容器的状态都是串行化的. 他们虽然实现了线程安全,但是严重降低了并发性,在多线程环境时,严重降低了应用程序的吞吐量. ConcurrentMap接口下有俩个重要的实现: ConcurrentHashMap ConcurrentSkipListMap(支持并发排序功能) ConcurrentHashMap原理: ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一…
同步类容器都是线程安全的,在某些场景下,需要枷锁保护符合操作,最经典ConcurrentModifiicationException,原因是当容器迭代的过程中,被并发的修改了内容. for (Iterator iterator = tickets.iterator(); iterator.hasNext();) { String string = (String) iterator.next(); tickets.remove(20); } //多线程使用Vector或者HashTable的示例…
JUC源码分析-集合篇:并发类容器介绍 同步类容器是 线程安全 的,如 Vector.HashTable 等容器的同步功能都是由 Collections.synchronizedMap 等工厂方法去创建实现的,底层使用 synchronized 关键字,每次只有一个线程访问容器.这明显不满足高并发的需求. JDK1.8 中的并发类容器 非阻塞队列 阻塞队列 ConcurrentHashMap [ArrayBlockingDeque] [ConcurrentSkipListMap] LinkedB…
前言 Java并发包有很大一部分都是关于并发容器的.Java在5.0版本之前线程安全的容器称之为同步容器.同步容器实现线程安全的方式:是将每个公有方法都使用synchronized修饰,保证每次只有一个线程能访问容器的状态.但是这样的串行度太高,将严重降低并发性,当多个线程竞争容器的锁时,吞吐量将严重降低.因此,在Java 5.0版本时提供了性能更高的容器来改进之前的同步容器,我们称其为并发容器. 下面我们先来介绍Java 5.0之前的同步容器,然后再来介绍Java 5.0之后的并发容器. Ja…
Copy-On-Write简称COW,是一种用于程序设计中的优化策略.JDK里的COW容器有两种: CopyOnWriteArrayList CopyOnWriteArraySet CopyOnWrite容器即写时复制的容器.通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器.这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容…
1 容器集简单介绍 java.util包下面的容器集主要有两种,一种是Collection接口下面的List和Set,一种是Map, 大致结构如下: Collection List LinkedList ArrayList Vector Stack Set HashSet TreeSet LinkedSet Map Hashtable HashMap WeakHashMap 2 同步容器 同步容器也叫线程安全容器,是通过syncrhoized关键字对线程不安全的操作进行加锁来保证线程安全的 其中…
同步容器类 同步容器类的创建 在早期的JDK中,有两种现成的实现,Vector和Hashtable,可以直接new对象获取: 在JDK1.2中,引入了同步封装类,可以由Collections.synchronizedXxxx等方法创建: 同步容器类的问题 同步容器类虽然都是线程安全的,但是在某些情况下(复合操作),仍然需要加锁来保护: 常见复合操作如下: 迭代:反复访问元素,直到遍历完全部元素: 跳转:根据指定顺序寻找当前元素的下一个(下n个)元素: 条件运算:例如若没有则添加等: 举个条件运算…
  同步容器(在并发下进行迭代的读和写时并不是线程安全的)   Vector.Stack.HashTable   Collections类的静态工厂方法创建的类(如Collections.synchronizedList)   通过对容器所有公共方法加synchronzied进行同步实现的(并发环境下性能很差)     JDK 1.5 新增的并发容器(线程安全)   ConcurrentHashMap(代替Map:内部采用Segment结构,进行两次Hash进行定位,写时只对Segment加锁)…