转载自  Java并发包:ConcurrentMap

文章译自:http://tutorials.jenkov.com/java-util-concurrent/index.html 
抽空翻译了一下这个教程的文章,后面会陆续放出,如有不妥,请批评指正。 
转自请注明出处。 
之前漏了一篇文章,这篇应该是在双端队列之后的,这里补上。

ConcurrentMap

java.util.concurrent.ConcurrentMap接口代表一个Map,它可以处理并发访问。ConcurrentMap除了继承自java.util.Map的方法,还有一些自己的原子方法。

ConcurrentMap的具体实现

由于ConcurrentMap是一个接口类,使用时需要使用它的实现类。Java.util.concurrent包中有下面关于ConcurrentMap接口的实现类。

  • ConcurrentHashMap

ConcurrentHashMap

ConcurrentHashMap除了有更好的并行性,它与java.util.HashTable类时非常相似的。当你从ConcurrentHashMap读取数据的时候ConcurrentHashMap是不会加锁的。另外,ConcurrenthashMap在写的时候不会全部加锁。它仅仅锁住Map中正在被写入的部分。

ConcurrentHashMap的另一个不同之处是,如果在迭代的时候ConcurrentHashMap被修改了,ConcurrentHashMap是不会抛出ConcurrentModificationException异常的。迭代器不能被超过一个以上的线程使用。

查看官方文档获取ConcurrentMap和ConcurrentHashMap更详细的信息。

ConcurrentMap实例

ConcurrentMap concurrentMap = new ConcurrentHashMap();concurrentMap.put("key", "value");Object value = concurrentMap.get("key");

ConcurrentNavigableMap

java.util.concurrent.ConcurrentNavgableMap接口类是一种支持并行访问的java.util.NavigableMap,并且它的子map也支持并行访问,子map是通过headMap(),subMap()和tailMap()等方法返回的。

这里不重新解释NavigableMap中已有的相同方法,我们仅看看在ConcurrentNavigableMap中增加的一些方法。

haedMap()

headMap(T toKey) 返回一个包含许多键的map,其中所有键值是严格少于给定的toKey。

如果你改变了原始的map,这些改变也会反映到head map上。

下面的例子说明了headMap()方法的使用。

ConcurrentNavigableMap map = new ConcurrentSkipListMap();map.put("1", "one");
map.put("2", "two");
map.put("3", "three");ConcurrentNavigableMap headMap = map.headMap("2");

headMap将会指向一个仅仅包含key为“1”的ConcurrentNavigableMap,因为只有这个key是严格小于“2”的。ConcurrentSkipListMap是ConcurrentNavigableMap的实现类。

查看JavaDoc了解这个方法以及它的重载版本更详细的执行情况。

tailMap()

tailMap(T fromKey)返回一个包含许多键的map,其中所有键值是大于或者等于给定的fromKey的。

如果你改变了原始的map,这些改变也会反映到head map上。

下面的例子说明了tailMap()方法的使用。

ConcurrentNavigableMap map = new ConcurrentSkipListMap();map.put("1", "one");
map.put("2", "two");
map.put("3", "three");ConcurrentNavigableMap tailMap = map.tailMap("2");

tailMap将包含“2”、“3”两个键,因为这两个键是大于或者等于给定的键值“2”。 
查看JavaDoc了解这个方法以及它的重载版本更详细的执行情况。

subMap()

subMap()方法返回一个包含许多键的map,这些键值是介于传给该方法的(including)和(excluding)两个参数之间的,下面是一个例子:

ConcurrentNavigableMap map = new ConcurrentSkipListMap();map.put("1", "one");
map.put("2", "two");
map.put("3", "three");ConcurrentNavigableMap subMap = map.subMap("2", "3");

方法返回的subMap仅包含一个key等于“2”的键值对,因为只有这个键是大于或等“2”,并且小于“3”的。

更多方法

ConcurrentNavigableMap接口还包含跟多的一些方法也许会用到的,例如:

  • descendingKeySet()
  • descendingMap()
  • navigableKeySet()

更多信息请查看官方JavaDoc。

Java并发包:ConcurrentMap相关推荐

  1. java并发包线程池原理分析锁的深度化

    java并发包&线程池原理分析&锁的深度化 并发包 同步容器类 Vector与ArrayList区别 1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素 ...

  2. 腾讯面试题Java 并发包之线程池综述

    Java 并发包之线程池综述 ■ 线程池的创建 在Java中,您可以通过调整-Xss参数来调节每个线程栈的大小(64bit系统默认1024KB),当减小该值时意味着可以创建更多的线程数,但问题是JVM ...

  3. 死磕java并发cas_死磕 java并发包之AtomicInteger源码分析

    问题 (1)什么是原子操作? (2)原子操作和数据库的ACID有啥关系? (3)AtomicInteger是怎么实现原子操作的? (4)AtomicInteger是有什么缺点? 简介 AtomicIn ...

  4. java并发包系列---LockSupport

    长久以来对线程阻塞与唤醒经常我们会使用object的wait和notify,除了这种方式,java并发包还提供了另外一种方式对线程进行挂起和恢复,它就是并发包子包locks提供的LockSupport ...

  5. 深入java并发包源码(三)AQS独占方法源码分析

    深入java并发包源码(一)简介 深入java并发包源码(二)AQS的介绍与使用 深入java并发包源码(三)AQS独占方法源码分析 AQS 的实现原理 学完用 AQS 自定义一个锁以后,我们可以来看 ...

  6. java 高并发第三阶段实战_Java 高并发第三阶段实战---Java并发包深入解析与使用详解...

    第三阶段的课程主要围绕着Java并发包的使用,展开详细的介绍,主要内容有1.原子包源码剖析,2.并发包工具类详细介绍,3.线程服务以及Future和callable等详细介绍,4.高并发容器和阻塞容器 ...

  7. 第 5-6 课:Java 并发包中的高级同步工具 + 面试题

    Java 中的并发包指的是 java.util.concurrent(简称 JUC)包和其子包下的类和接口,它为 Java 的并发提供了各种功能支持,比如: 提供了线程池的创建类 ThreadPool ...

  8. Java并发包基石-AQS详解

    目录 1 基本实现原理 1.1 如何使用 1.2 设计思想 2 自定义同步器 2.1 同步器代码实现 2.2 同步器代码测试 3 源码分析 3.1 Node结点 3.2 独占式 3.3 共享式 4 总 ...

  9. Java并发包——使用新的方式创建线程

    Java并发包--使用新的方式创建线程 摘要:本文主要学习了如何使用Java并发包中的类创建线程. 部分内容来自以下博客: https://www.cnblogs.com/dolphin0520/p/ ...

最新文章

  1. MFC如何打开文件路径
  2. 使用文本用户界面(NMTUI)进行网络配置
  3. 【spring-session】介绍
  4. 《数据库SQL实战》查找最晚入职员工的所有信息
  5. 角谱传播法matlab模拟,角谱法分析高斯光
  6. PIC18F452之1602自定义字符
  7. python 32bit数据结构_python实现bitmap数据结构详解
  8. AngularJS日期格式化
  9. python repair修复功能_详解Python修复遥感影像条带的两种方式
  10. Python+tkinter+sqlite3模拟通信录管理系统
  11. Java中HttpClient设置超时时间
  12. 金属粉末增材制造行业调研报告 - 市场现状分析与发展前景预测
  13. LNMP(linux+nginx+mysql+php)服务器环境配置
  14. WebForm与MVC模式优缺点
  15. electron入门笔记(三)- 引入bootstrap
  16. linux早期内核的khttpd服务器--策略污染机制
  17. android3d动画的实现,Android 3D旋转动画库
  18. 计算机组成与设计第五版课后答案ch04,数据结构第4章例题与答案
  19. idea调用自己的方法(introduce local variable)
  20. ps 快速切图

热门文章

  1. AcWing 1381. 阶乘
  2. Facade(外观)--对象结构型模式
  3. 安装 java decompiler_Eclipse离线安装Java Decompiler插件(反编译)
  4. HTMLCSS 超简单的前端设计入门-1!
  5. 经典排序算法(4)——折半插入排序算法详解
  6. Spring集成Mybatis配置映射文件方法详解
  7. Codeforces Round #700 (Div. 2) C. Searching Local Minimum 交互二分
  8. 最小生成树--Boruvka算法
  9. Acwing 276. I-区域
  10. 疾病预测和天气分析练习赛