1.hashtable和vector 它们是支持并发操作的并发容器,hashtable只不过是在hashmap的基础上,所有的方法上都加上synchronized关键字,vector在ArrayList的基础上,所有的方法上都加上synchronized关键字来达到同步的目的。

2.Collections中的方法 ![这里写图片描述](https://img-blog.csdn.net/20171204150228334?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzMzOTQwODg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 这些方法实现起来也非常简单,就是包装类,把集合包装起来,重写每个方法,在每个重写方法中加入一层锁,达到同步的目的,这算不上是什么高超的技巧。

3.ConcurrentHashMap

HashTable容器在竞争激烈的并发环境下表现出效率低下的原因,是因为所有访问HashTable的线程都必须竞争同一把锁,那假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术。

首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。

有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而而不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁。这里“按顺序”是很重要的,否则极有可能出现死锁。

ConcurrentHashMap是由Segment数组和HashEntry数组组成。Segment是一种可重入锁ReentrantLock,在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键值对数据。

一个ConcurrentHashMap里包含一个Segment数组,是一种链表结构, 一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素。

每个Segment守护着一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。

应用场景

当有一个大数组时需要在多个线程共享时就可以考虑是否把它给分层多个节点了,避免大锁。并可以考虑通过hash算法进行一些模块定位。

4.CopyOnWrite容器

CopyOnWrite容器也叫cow容器。如英文,它是一个写是复制的容器。

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

JDK中并没有提供CopyOnWriteMap,我们可以参考CopyOnWriteArrayList来实现一个:

import java.util.Collection;
import java.util.Map;
import java.util.Set;public class CopyOnWriteMap<K, V> implements Map<K, V>, Cloneable {private volatile Map<K, V> internalMap;public CopyOnWriteMap() {internalMap = new HashMap<K, V>();}public V put(K key, V value) {synchronized (this) {Map<K, V> newMap = new HashMap<K, V>(internalMap);V val = newMap.put(key, value);internalMap = newMap;return val;}}public V get(Object key) {return internalMap.get(key);}public void putAll(Map<? extends K, ? extends V> newData) {synchronized (this) {Map<K, V> newMap = new HashMap<K, V>(internalMap);newMap.putAll(newData);internalMap = newMap;}}
}

实现很简单,只要了解了CopyOnWrite机制,我们可以实现各种CopyOnWrite容器,并且在不同的应用场景中使用。

Java多线程之并发容器(五)相关推荐

  1. Java 多线程 —— 常用并发容器

    引言 本博客基于常用的并发容器,简单概括其基本特性和简单使用,并不涉及较深层次的原理分析和全面的场景用法. 适合对不了解并发容器的同学,工作中遇到类似的场景,能够对文中提到的并发容器留有简单印象就好. ...

  2. 【Java多线程】并发容器CopyOnWriteArrayList

    一个不安全的List 预期输出结果为10000,但是实际运行结果为9992,是因为线程不安全,应该使用synchronized同步块 不安全代码 package cn.hanquan.test;imp ...

  3. Java集合之并发容器

    一:java中的并发容器总结 JDK提供的这些容器大部分在 java.util.concurrent 包中. ConcurrentHashMap: 线程安全的HashMap CopyOnWriteAr ...

  4. Java多线程与并发系列从0到1全部合集,强烈建议收藏!

    在过去的时间中,我写过Java多线程与并发的整个系列. 为了方便大家的阅读,也为了让知识更系统化,这里我单独把Java多线程与并发的整个系列一并罗列于此,希望对有用的人有用,也希望能帮助到更多的人. ...

  5. JAVA多线程和并发面试问题

    转载自   JAVA多线程和并发面试问题 Java多线程面试问题 1.进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程 ...

  6. JAVA多线程和并发基础面试问答(转载)

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  7. java书籍_还搞不定Java多线程和并发编程面试题?你可能需要这一份书单!

    点击蓝色"程序员书单"关注我哟 加个"星标",每天带你读好书! ​ 在介绍本书单之前,我想先问一下各位读者,你们之前对于Java并发编程的了解有多少呢.经过了1 ...

  8. Java多线程与并发相关 — 原理

    Java多线程与并发相关 - 原理 一 synchronized同步 1. 线程安全问题的主要诱因? 存在共享资源(也称临界资源); 存在多条线程共同操作这些共享数据; 2. 解决办法. 同一时刻有且 ...

  9. JAVA Java多线程与并发库

    Java多线程与并发库 同步方式 import javax.xml.stream.events.StartDocument;public class TestSynchronized {public ...

最新文章

  1. pycharm配置python解释器_Python大佬手把手教你进行Pycharm活动模板配置
  2. ConcurrentModificationException 问题
  3. 新思科技助力IBM将AI计算性能提升1000倍
  4. macOS的关于屏幕录制的快捷键和操作
  5. storm 简介及单机版安装指南
  6. 一个优秀的可定制化Flutter相册组件,看这一篇就够了
  7. docker安装jira心得
  8. mongodb分片部署
  9. java面试题干货126-170
  10. 相继平均法matlab代码_matlab实现不同平均数的求法
  11. VB2010实例(3)_闪烁的窗体
  12. Java NumberFormat,DecimalFormat保存小数位数
  13. 可以免费文字识别app有哪些?有这3款app就能够实现提取文字自由
  14. ascii转utf8 php,PHP 将ASCII转换为UTF-8编码
  15. Oracle如何保持一致读?
  16. 机器语言到Java语言的技术背景
  17. Linux驱动中如何对文件进行读写
  18. Qt编写安防楼宇对讲管理平台源码
  19. 《Visual C++ 2010入门教程》 旗舰级详尽教程
  20. AD20设计规则小结(Design Rules)

热门文章

  1. 懒人chromium net android移植指南
  2. Redis 过期键删除策略、内存淘汰机制
  3. MySQL(二): 表的增删查改
  4. 五分钟快速理解 Reactor 模型
  5. 编程思考:对象生命周期的问题
  6. DCT如此重要,作者当初竟然不知道?
  7. FPGA视频加速的未来
  8. 这篇Redis文章,图灵看了都说好
  9. 大牛书单 | 腾讯技术大咖推荐你五一看这些书
  10. docker 网络模型