在婚恋网站做翻译好吗,wordpress没有路径,html5国外酷炫网站,稳定的手机网站设计之前谈过高并发编程系列#xff1a; 高并发编程系列#xff1a;4种常用Java线程锁的特点#xff0c;性能比较、使用场景 高并发编程系列#xff1a;CountDownLatch、Semaphore等4大并发工具类详解 高并发编程系列#xff1a;4大JVM性能分析工具详解#xff0c;及内存… 之前谈过高并发编程系列 高并发编程系列4种常用Java线程锁的特点性能比较、使用场景 高并发编程系列CountDownLatch、Semaphore等4大并发工具类详解 高并发编程系列4大JVM性能分析工具详解及内存泄漏分析方案 高并发编程系列ConcurrentHashMap的实现原理(JDK1.7和JDK1.8) Java并发编程系列深入详解Synchronized同步锁的底层实现 今天详细介绍并发容器的实现原理与同步容器的区别等。 并发容器的由来 在Java并发编程中经常听到Java集合类同步容器、并发容器那么他们有哪些具体分类以及各自之间的区别和优劣呢 只有把这些梳理清楚了你才能真正掌握在高并发的环境下正确使用好并发容器我们先从Java集合类同步容器谈起。 1.什么是同步容器 Java的集合容器框架中主要有四大类别List、Set、Queue、Map大家熟知的这些集合类ArrayList、LinkedList、HashMap这些容器都是非线程安全的。 如果有多个线程并发地访问这些容器时就会出现问题。因此在编写程序时在多线程环境下必须要求程序员手动地在任何访问到这些容器的地方进行同步处理这样导致在使用这些容器的时候非常地不方便。 所以Java先提供了同步容器供用户使用。 同步容器可以简单地理解为通过synchronized来实现同步的容器比如Vector、Hashtable以及SynchronizedList等容器。 2.同步容器主要的分类 Vector Stack HashTable Collections.synchronized方法生成 同步容器面临的问题 可以通过查看VectorHashtable等这些同步容器的实现代码可以看到这些容器实现线程安全的方式就是将它们的状态封装起来并在需要同步的方法上加上关键字synchronized。 这样做的代价是削弱了并发性当多个线程共同竞争容器级的锁时吞吐量就会降低。 例如 HashTable只要有一条线程获取了容器的锁之后其他所有的线程访问同步函数都会被阻塞因此同一时刻只能有一条线程访问同步函数。 因此为了解决同步容器的性能问题所以才有了并发容器。 什么是并发容器 java.util.concurrent包中提供了多种并发类容器。 并发类容器是专门针对多线程并发设计的使用了锁分段技术只对操作的位置进行同步操作但是其他没有操作的位置其他线程仍然可以访问提高了程序的吞吐量。 采用了CAS算法和部分代码使用synchronized锁保证线程安全。 并发容器有哪些分类 1.ConcurrentHashMap 对应的非并发容器HashMap 目标代替Hashtable、synchronizedMap支持复合操作 原理JDK6中采用一种更加细粒度的加锁机制Segment“分段锁”JDK8中采用CAS无锁算法。 2.CopyOnWriteArrayList 对应的非并发容器ArrayList 目标代替Vector、synchronizedList 原理利用高并发往往是读多写少的特性对读操作不加锁对写操作先复制一份新的集合在新的集合上面修改然后将新集合赋值给旧的引用并通过volatile 保证其可见性当然写操作的锁是必不可少的了。 3.CopyOnWriteArraySet 对应的非并发容器HashSet 目标代替synchronizedSet 原理基于CopyOnWriteArrayList实现其唯一的不同是在add时调用的是CopyOnWriteArrayList的addIfAbsent方法其遍历当前Object数组如Object数组中已有了当前元素则直接返回如果没有则放入Object数组的尾部并返回。 4.ConcurrentSkipListMap 对应的非并发容器TreeMap 目标代替synchronizedSortedMapTreeMap 原理Skip list跳表是一种可以代替平衡树的数据结构默认是按照Key值升序的。 5.ConcurrentSkipListSet 对应的非并发容器TreeSet 目标代替synchronizedSortedSet 原理内部基于ConcurrentSkipListMap实现 6.ConcurrentLinkedQueue 不会阻塞的队列 对应的非并发容器Queue 原理基于链表实现的FIFO队列LinkedList的并发版本 7.LinkedBlockingQueue、ArrayBlockingQueue、PriorityBlockingQueue 对应的非并发容器BlockingQueue 特点拓展了Queue增加了可阻塞的插入和获取等操作 原理通过ReentrantLock实现线程安全通过Condition实现阻塞和唤醒 实现类 LinkedBlockingQueue基于链表实现的可阻塞的FIFO队列 ArrayBlockingQueue基于数组实现的可阻塞的FIFO队列 PriorityBlockingQueue按优先级排序的队列 ConcurrentHashMap的实现 HashMap,Hashtable与ConcurrentHashMap都是实现的哈希表数据结构在随机读取的时候效率很高。 Hashtable实现同步是利用synchronized关键字进行锁定的其是针对整张哈希表进行锁定的即每次锁住整张表让线程独占在线程安全的背后是巨大的浪费。 ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度进行区别以及如何区锁定。 上图中左边是Hashtable的实现方式可以看到锁住整个哈希表而右边则是ConcurrentHashMap的实现方式单独锁住每一个桶segment.ConcurrentHashMap将哈希表分为16个桶默认值诸如get,put,remove等常用操作只锁当前需要用到的桶,而size才锁定整张表。 原来只能一个线程进入现在却能同时接受16个写线程并发进入写线程需要锁定而读线程几乎不受限制。 所以才有了并发性的极大提升。 高并发编程除了并发容器还会涉及到并发工具类:CountDownLatch等后续将详细的介绍并发工具类以及ConcurrentHashMap的底层实现细节不仅要知其然,还要知其所以然这样才能更好的掌握好高并发编程。 你可能也喜欢: Java多线程系列三Java线程池的使用方式及核心运行原理 Java多线程系列(四)4种常用Java线程锁的特点性能比较、使用场景Java多线程系列(八)ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)Java多线程系列一最全面的Java多线程学习概述 Java多线程系列六深入详解Synchronized同步锁的底层实现 Java多线程系列十源码剖析AQS的实现原理